本篇博文展示Windows平台C语言socket编程基本方法
客户端
//main.h #ifndef _H_ #define _H_ #include
#include
#pragma comment(lib,"Ws2_32.lib") #endif
//main.cpp #include"main.h" int main() { WORD wversionrequest = { 0 }; WSADATA wsadate = { 0 }; int err = 0; int iret = 0; char buffer[1024] = { 0 }; SOCKET sockfd = 0; hostent* h = NULL; sockaddr_in servaddr = { 0 }; //注册协议版本 wversionrequest = MAKEWORD(2, 2); err = WSAStartup(wversionrequest, &wsadate); #if 1 if (err != 0) { perror("WSAStartup"); system("pause"); return -1; } #else if ((LOBYTE(wsadate.wVersion != 2) ||( HIBYTE(wsadate.wVersion) != 2))) { perror("WSAStartup"); system("pause"); return -1; } #endif printf("WSAStartup ok\n"); //初始化socket sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == SOCKET_ERROR) { perror("socket"); system("pause"); return -1; } printf("socket ok\n"); //设置服务器端地址信息 servaddr.sin_family = AF_INET; servaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //unsigned long PASCAL FAR inet_addr (_In_z_ const char FAR * cp);将点分十进制的IP地址转换为网络字节序的二进制值 servaddr.sin_port = htons(12345); //向服务器端发起连接 err = connect(sockfd, (sockaddr*)&servaddr, sizeof(servaddr)); if (err != 0) { perror("connect"); closesocket(sockfd); return -1; } printf("connect ok\n"); //与服务器端通信 for (int i = 1; i <= 3; i++) { //发送信息 memset(buffer, 0, sizeof(buffer)); sprintf(buffer, "这是%d号消息", i); iret = send(sockfd, buffer, strlen(buffer), 0); if (iret <= 0) { perror("send"); printf("iret=%d\n", iret); break; } printf("发送:%s\n", buffer); //接收信息 memset(buffer, 0, sizeof(buffer)); iret = recv(sockfd, buffer, sizeof(buffer), 0); if (iret <= 0) { perror("recv"); printf("iret=%d\n", iret); break; } printf("接收:%s\n", buffer); } //关闭socket closesocket(sockfd); WSACleanup(); system("pause"); return 0; }
服务端
//main.h #ifndef _H_ #define _H_ #include
#include
#pragma comment(lib,"Ws2_32.lib") #endif // !_H_
//main.cpp #include"main.h" int main() { WORD wversionrequest = { 0 }; WSADATA wsadate = { 0}; int err=0; int iret=0; SOCKET listenfd = 0; SOCKET clientfd = 0; sockaddr_in servaddr = { 0 };//服务端地址结构 sockaddr_in clientaddr = { 0 };//客户端地址结构 int socklen = sizeof(sockaddr_in); char buffer[1024] = { 0 }; //注册协议版本 wversionrequest = MAKEWORD(2, 2); err = WSAStartup(wversionrequest, &wsadate); #if 1 if (err != 0) { perror("WSAStartup"); system("pause"); return -1; } #else if (LOBYTE((wsadate.wVersion != 2) || HIBYTE(wsadate.wVersion != 2))) { perror("WSAStartup"); system("pause"); return -1; } #endif // 1 printf("WSAStartup ok\n"); //创建服务端监听socket listenfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (listenfd == SOCKET_ERROR) { perror("socket"); system("pause"); return -1; } printf("socket ok\n"); //设置服务端地址和端口 servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); //u_long PASCAL FAR htonl ( _In_ u_long hostlong);将主机字节序转换为网络字节序 //对应u_long PASCAL FAR ntohl (_In_ u_long netlong);将网络字节序转换为主机字节序 //INADDR_ANY表示0.0.0.0,即表示本机所有IP,方便于多块网卡 servaddr.sin_port = htons(12345); //u_short PASCAL FAR htons (_In_ u_short hostshort);将主机字节序转换为网络字节序 //对应u_short PASCAL FAR ntohs (_In_ u_short netshort);将网络字节序转换为主机字节序 //绑定服务端地址和端口 err = bind(listenfd, (sockaddr*)&servaddr, sizeof(servaddr)); if ( err!= 0) { perror("bind"); closesocket(listenfd); system("pause"); return -1; } printf("bind ok\n"); //设置监听 err = listen(listenfd, 5); if ( err!= 0) { perror("listen"); closesocket(listenfd); system("pause"); return -1; } printf("listen ok\n"); //接受连接 clientfd = accept(listenfd, (sockaddr*)&clientaddr, &socklen); if (clientfd == 0) { perror("accept"); } else { printf("客户端%s已连接\n", inet_ntoa(clientaddr.sin_addr)); } //与客户端通信 while (TRUE) { //接收信息 memset(buffer, 0, sizeof(buffer)); iret = recv(clientfd, buffer, sizeof(buffer), 0); if (iret <= 0) { printf("iret=%d\n", iret); perror("recv"); break; } printf("接收:%s\n", buffer); //发送信息 strcpy(buffer, "OK"); iret = send(clientfd, buffer, sizeof(buffer), 0); if (iret <= 0) { printf("iret=%d\n", iret); perror("send"); break; } printf("发送:%s\n", buffer); } //关闭socket closesocket(listenfd); closesocket(clientfd); WSACleanup(); system("pause"); return 0; }
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/215373.html原文链接:https://javaforall.net
