Socket 编程(TCP)
来源:互联网 发布:java 网站源码 编辑:程序博客网 时间:2024/04/29 19:20
下面是接收数据和发送数据的函数
- int Receive(SOCKET fd, char *szText, int len)
- {
- int cnt;
- int rc;
- cnt = len;
- while (cnt > 0)
- {
- rc = recv(fd, szText, cnt, 0);
- if (rc == SOCKET_ERROR)
- {
- return - 1;
- }
- if (rc == 0)
- return len - cnt;
- szText += rc;
- cnt -= rc;
- }
- return len;
- }
- int Send(SOCKET fd, char *szText, int len)
- {
- int cnt;
- int rc;
- cnt = len;
- while (cnt > 0)
- {
- rc = send(fd, szText, cnt, 0);
- if (rc == SOCKET_ERROR)
- {
- return - 1;
- }
- if (rc == 0)
- return len - cnt;
- szText += rc;
- cnt -= rc;
- }
- return len;
- }
服务器端:
在服务器端,主要是启动Socket和监听线程。
- #define DEFAULT_PORT 2000
- void CServerDlg::OnStart()
- {
- sockaddr_in local;
- DWORD dwThreadID = 0;
- local.sin_family = AF_INET;
- //设置的端口为DEFAULT_PORT。
- local.sin_port = htons(DEFAULT_PORT);
- //IP地址设置成INADDR_ANY,让系统自动获取本机的IP地址。
- local.sin_addr.S_un.S_addr = INADDR_ANY;
- //初始化Socket
- m_Listening = socket(AF_INET, SOCK_STREAM, 0);
- if (m_Listening == INVALID_SOCKET)
- {
- return ;
- }
- //将本地地址绑定到所创建的套接字上
- if (bind(m_Listening, (LPSOCKADDR) &local, sizeof(local)) == SOCKET_ERROR)
- {
- closesocket(m_Listening);
- return ;
- }
- //创建监听线程,这样也能响应界面上操作。
- m_hListenThread = ::CreateThread(NULL, 0, ListenThread, this, 0,
- &dwThreadID);
- m_StartBtn.EnableWindow(FALSE);
- m_StopBtn.EnableWindow(TRUE);
- }
- //监听线程函数:
- WORD WINAPI CServerDlg::ListenThread(LPVOID lpparam)
- {
- CServerDlg *pDlg = (CServerDlg*)lpparam;
- if (pDlg == NULL)
- return 0;
- SOCKET Listening = pDlg->m_Listening;
- //开始监听是否有客户端连接。
- if (listen(Listening, 40) == SOCKET_ERROR)
- {
- return 0;
- }
- char szBuf[MAX_PATH];
- //初始化
- memset(szBuf, 0, MAX_PATH);
- while (1)
- {
- SOCKET ConnectSocket;
- sockaddr_in ClientAddr;
- int nLen = sizeof(sockaddr);
- //阻塞直到有客户端连接,不然多浪费CPU资源。
- ConnectSocket = accept(Listening, (sockaddr*) &ClientAddr, &nLen);
- //都到客户端的IP地址。
- char *pAddrname = inet_ntoa(ClientAddr.sin_addr);
- pDlg->Receive(ConnectSocket, szBuf, 100);
- //界面上显示请求数据。
- pDlg->SetRequestText(szBuf);
- strcat(szBuf, " :我是老猫,收到(");
- strcat(szBuf, pAddrname);
- strcat(szBuf, ")");
- //向客户端发送回应数据
- pDlg->Send(ConnectSocket, szBuf, 100);
- }
- return 0;
- }
服务器端一直在监听是否有客户端连接,如有连接,处理客户端的请求,给出回应,然后继续监听。
客户端:
客户端的发送函数:
- #define DEFAULT_PORT 2000
- void CClientDlg::OnSend()
- {
- DWORD dwIP = 0;
- TCHAR szText[MAX_PATH];
- memset(szText, 0, MAX_PATH);
- m_IP.GetWindowText(szText, MAX_PATH);
- //把字符串形式的IP地址转成IN_ADDR结构需要的形式。
- dwIP = inet_addr(szText);
- m_RequestEdit.GetWindowText(szText, MAX_PATH);
- ockaddr_in local;
- SOCKET socketTmp;
- //必须是AF_INET,表示该socket在Internet域中进行通信
- local.sin_family = AF_INET;
- //端口号
- local.sin_port = htons(DEFAULT_PORT);
- //服务器的IP地址。
- local.sin_addr.S_un.S_addr = dwIP;
- //初始化Socket
- socketTmp = socket(AF_INET, SOCK_STREAM, 0);
- //连接服务器
- if (connect(socketTmp, (LPSOCKADDR) &local, sizeof(local)) < 0)
- {
- closesocket(socketTmp);
- MessageBox("连接服务器失败。");
- return ;
- }
- //发送请求,为简单只发100字节,在服务器端也规定100字节。
- Send(socketTmp, szText, 100);
- //读取服务器端返回的数据。
- memset(szText, 0, MAX_PATH);
- //接收服务器端的回应。
- Receive(socketTmp, szText, 100);
- CHAR szMessage[MAX_PATH];
- memset(szMessage, 0, MAX_PATH);
- strcat(szMessage, szText);
- //界面上显示回应数据。
- m_ReplyBtn.SetWindowText(szMessage);
- closesocket(socketTmp);
- }
0 0
- Socket 编程(TCP)
- Socket 编程(TCP)
- socket编程(TCP)
- socket编程流程(tcp)
- socket编程(TCP&UDP)
- socket编程(TCP、UDP)
- linux socket(tcp)编程
- socket编程(TCP、UDP)
- Socket编程(TCP、UDP)
- unix c++的socket编程(TCP)
- Linux socket编程(TCP,UDP,RAW)
- C++网络编程(socket)TCP
- java tcp/ip socket编程(一)
- TCP(面向连接)的socket编程
- 网络编程(TCP & SOCKET)
- android 之 socket编程(TCP&UDP)
- Linux socket编程(TCP,UDP,RAW)
- linux下socket编程(1)tcp
- HASH入门 POJ1840
- STL与多线程+写时拷贝
- UVA 608 - Counterfeit Dollar(直接枚举)
- oc中的构造方法和description方法
- js库
- Socket 编程(TCP)
- 搜索官方的一篇相关性文章分享
- NPOI读取Excel
- Warning: Variable 'a' cannot be saved to a MAT-file whose version is older than 7.3.
- Cannot open precompiled header file: 'Debug/xxoo.pch': No such file or directory
- 2014年的打算
- java.lang.NoSuchMethodError: org.slf4j.impl.StaticLoggerBinder.getSingleton()Lorg/slf4j/impl/Static
- python使用os模块的os.walk遍历文件夹
- 互联网创业五大核心问题:既可致胜也可致命