之前一直在Linux系统开发C语言的socket,由于项目的需要 需要在windows下开发,第一次在windows下开
发,顺便记录下来。
首先socket的通信流程:
Server程序:
1 .创建socket:socket();
2. 绑定socket的IP+端口号:bind();
3.监听端口号:listen();
4.接收客户端的连接请求:accept();
5.读写客户端:recv(),send();
6.关闭socket;close();
Client程序:
1.创建socket:socket();
2.连接指定计算的端口:connect();
3.发送或者手服务器的数据:send(),recv();
4.关闭socket:close();
socket是基于TCP/IP通信协议的,下图为三次握手:
服务器端代码:
#include <stdlib.h> #include <stdio.h> #include <winsock2.h> #include <windows.h> #pragma comment(lib,"ws2_32.lib") int main(int argc, char* argv[]) { //初始化WSA WORD sockVersion = MAKEWORD(2, 2); WSADATA wsaData; if (WSAStartup(sockVersion, &wsaData) != 0) { return 0; } //创建套接字 SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (slisten == INVALID_SOCKET) { printf("socket error !"); return 0; } //绑定IP和端口 struct sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons(8888); sin.sin_addr.S_un.S_addr = INADDR_ANY; if (bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) { printf("bind error !"); } //开始监听 if (listen(slisten, 5) == SOCKET_ERROR) { printf("listen error !"); return 0; } //循环接收数据 SOCKET sClient; struct sockaddr_in remoteAddr; int nAddrlen = sizeof(remoteAddr); //char revData[255]; printf("等待连接...\n"); sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen); while (1) { char revData[255]; //printf("等待连接...\n"); //sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen); if (sClient == INVALID_SOCKET) { printf("accept error !"); continue; } printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr)); //接收数据 int ret = recv(sClient, revData, 255, 0); //printf(ret); if (ret > 0) { revData[ret] = 0x00; printf(revData); } //发送数据 char * sendData = "你好,TCP客户端!\n"; send(sClient, sendData, strlen(sendData), 0); } closesocket(sClient); closesocket(slisten); WSACleanup(); return 0; }客户端代码:
#include <stdio.h> #include <stdlib.h> #include <winsock2.h> #include <windows.h> #pragma comment(lib,"ws2_32.lib") #include <STDIO.H> int main(int argc, char* argv[]) { WORD sockVersion = MAKEWORD(2, 2); WSADATA data; if (WSAStartup(sockVersion, &data) != 0) { return 0; } SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sclient == INVALID_SOCKET) { printf("invalid socket !"); return 0; } struct sockaddr_in serAddr; serAddr.sin_family = AF_INET; serAddr.sin_port = htons(8888); serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); if (connect(sclient, (struct sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR) { printf("connect error !"); closesocket(sclient); return 0; } for (int i = 0; i < 1000; i++) { char * sendData = "csi接收 二进制文件未解析\n"; send(sclient, sendData, strlen(sendData), 0); char recData[255]; /*int ret = recv(sclient, recData, 255, 0); if (ret > 0) { recData[ret] = 0x00; //printf(recData); printf("%d%s",i,recData); } */ } closesocket(sclient); WSACleanup(); return 0; }提示:在DevC++中运行时需要在 工具--》编译选项--》