服务端:
- #include <stdio.h>
- #include <stdlib.h>
- #include <errno.h>
- #include <string.h>
- #include <winsock2.h>
- #pragma comment (lib, "ws2_32.lib")
- #define SERVER_PORT 3333 ///< 服务器端口
- #define BACKLOG 10 ///< 最大连接数
- #define TCPIP_MODE AF_INET
- typedef int HSOCKET;
- int main()
- {
- int sin_size;
- WORD SockVersion = MAKEWORD(2, 2);
- WSADATA wsadata;
- HSOCKET hServer, hClient;
- sockaddr_in my_addr, remote_addr;
- char *msg = "Hello World";
- if(0 != WSAStartup(SockVersion, &wsadata))
- {
- printf("Socket启动错误!/n");
- WSACleanup();
- exit(1);
- }
- printf("Socket启动成功.../n");
- if(-1 == (hServer = socket(TCPIP_MODE, SOCK_STREAM, 0)))
- {
- printf("Socket创建错误!/n");
- WSACleanup();
- exit(1);
- }
- printf("Socket创建成功.../n");
- my_addr.sin_family = TCPIP_MODE;
- my_addr.sin_addr.s_addr = INADDR_ANY;
- my_addr.sin_port = htons(SERVER_PORT);
- memset(my_addr.sin_zero, 0, sizeof(my_addr.sin_zero));
- if(-1 == bind(hServer, (sockaddr *)&my_addr, sizeof(sockaddr)))
- {
- printf("Bind错误!/n");
- WSACleanup();
- exit(1);
- }
- printf("端口绑定成功.../n");
- if(-1 == (listen(hServer, BACKLOG)))
- {
- printf("Listen错误!/n");
- WSACleanup();
- exit(1);
- }
- printf("Socket监听成功.../n");
- while(true)
- {
- sin_size = sizeof(sockaddr_in);
- if(-1 == (hClient = accept(hServer, (sockaddr *)&remote_addr, &sin_size)))
- {
- printf("Accept错误!/n");
- continue;
- }
- printf("收到客户端请求 | ");
- if(-1 == send(hClient, msg, strlen(msg), 0))
- {
- printf("Send错误!/n");
- closesocket(hClient);
- WSACleanup();
- exit(1);
- }
- printf("信息发送成功.../n");
- closesocket(hClient);
- }
- WSACleanup();
- return 0;
- }
客户端:
- #include <stdio.h>
- #include <stdlib.h>
- #include <errno.h>
- #include <string.h>
- #include <winsock2.h>
- #define SERVER_PORT 3333 ///< 服务器端口
- #define MAXDATASIZE 100 ///< 接受信息最大长度
- #define GetHostByName gethostbyname
- #define TCPIP_MODE AF_INET
- #pragma comment (lib, "ws2_32.lib")
- typedef int HSOCKET;
- int main(int argc, char *argv[])
- {
- WORD SocketVersion = MAKEWORD(2, 2); ///< Sock版本
- WSAData wd;
- HSOCKET hClient[20]; ///< 连接主机的套接字
- int RecvBytes; ///< 接受消息的长度
- char buf[MAXDATASIZE] = { 0 }; ///< 接受消息缓冲区
- hostent *host; ///< 主机信息
- sockaddr_in server_addr; ///< 主机地址
- /** 启动Sock */
- if(0 != WSAStartup(SocketVersion, &wd))
- {
- printf("Socket启动错误!/n");
- exit(1);
- }
- printf("Socket启动成功.../n");
- if(argc < 2)
- {
- WSACleanup();
- printf("错误的参数个数!/n");
- exit(1);
- }
- /** 获取主机信息 */
- if(NULL == (host = GetHostByName(argv[1])))
- {
- WSACleanup();
- printf("主机地址获取错误!/n");
- exit(1);
- }
- printf("主机 %s 信息获取成功.../n", argv[1]);
- /** 创建Sock */
- for(int i = 0; i < 20; i++)
- if(-1 == (hClient[i] = socket(TCPIP_MODE, SOCK_STREAM, 0)))
- {
- closesocket(hClient[i]);
- WSACleanup();
- printf("Socket创建错误!/n");
- exit(1);
- }
- printf("Socket创建成功.../n");
- /** 初始化主机地址信息 */
- server_addr.sin_family = TCPIP_MODE;
- server_addr.sin_port = htons(SERVER_PORT);
- server_addr.sin_addr = *((in_addr *)host->h_addr);
- memset(server_addr.sin_zero, 0, sizeof(server_addr.sin_zero));
- /** 连接主机 */
- for(int i = 0; i < 20; i++)
- if(-1 == connect(hClient[i], (sockaddr *)&server_addr, sizeof(sockaddr_in)))
- {
- closesocket(hClient[i]);
- WSACleanup();
- printf("连接主机错误!/n");
- exit(1);
- }
- printf("连接主机成功.../n");
- /** 接受消息 */
- for(int i = 0; i < 20; i++)
- {
- if(-1 == (RecvBytes = recv(hClient[i], buf, MAXDATASIZE, 0)))
- {
- closesocket(hClient[i]);
- WSACleanup();
- printf("收取信息错误!/n");
- exit(1);
- }
- /** 输出消息 */
- buf[RecvBytes] = '/0';
- printf("收取信息成功: %s.../n", buf);
- /** 善后 */
- closesocket(hClient[i]);
- }
- WSACleanup();
- return 0;
- }