C语言SOCKET通讯学习
【服务器端】#include "stdafx.h"#include <stdio.h>#include <winsock2.h>#include <winsock2.h>#define SERVER_PORT 5208 //侦听端口voidmain(){WORDwVersionRequested;WSADATA wsaData;intret, nLeft, length;SOCKET sListen, sServer;//侦听套接字,连接套接字structsockaddr_in saServer, saClient;//地址信息char*ptr;//用于遍历信息的指针//WinSock初始化wVersionRequested=MAKEWORD(2, 2);//希望使用的WinSock DLL 的版本ret=WSAStartup(wVersionRequested, &wsaData);if(ret!=0){printf("WSAStartup() failed!\n");return;}//创建Socket,使用TCP协议sListen=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(sListen == INVALID_SOCKET){WSACleanup();printf("socket() faild!\n");return;}//构建本地地址信息saServer.sin_family = AF_INET;//地址家族saServer.sin_port = htons(SERVER_PORT);//注意转化为网络字节序saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//使用INADDR_ANY 指示任意地址//绑定ret = bind(sListen, (structsockaddr *)&saServer,sizeof(saServer));if(ret == SOCKET_ERROR){printf("bind() faild! code:%d\n", WSAGetLastError());closesocket(sListen);//关闭套接字WSACleanup();return;}//侦听连接请求ret = listen(sListen, 5);if(ret == SOCKET_ERROR){printf("listen() faild! code:%d\n", WSAGetLastError());closesocket(sListen);//关闭套接字return;}printf("Waiting for client connecting!\n");printf("Tips: Ctrl+c to quit!\n");//阻塞等待接受客户端连接while(1)//循环监听客户端,永远不停止,所以,在本项目中,我们没有心跳包。{length =sizeof(saClient);sServer = accept(sListen, (structsockaddr *)&saClient, &length);if(sServer == INVALID_SOCKET){printf("accept() faild! code:%d\n", WSAGetLastError());closesocket(sListen);//关闭套接字WSACleanup();return;}charreceiveMessage[5000];nLeft =sizeof(receiveMessage);ptr = (char*)&receiveMessage;while(nLeft>0){//接收数据ret = recv(sServer, ptr, 5000, 0);if(ret == SOCKET_ERROR){printf("recv() failed!\n");return;}if(ret == 0)//客户端已经关闭连接{printf("Client has closed the connection\n");break;}nLeft -= ret;ptr += ret;}printf("receive message:%s\n", receiveMessage);//打印我们接收到的消息。}// closesocket(sListen);// closesocket(sServer);// WSACleanup();}【客户端】#include "stdafx.h"#include <stdio.h>#include <stdlib.h>#include <winsock2.h>#define SERVER_PORT 5208 //侦听端口voidmain(){WORDwVersionRequested;WSADATA wsaData;intret;SOCKET sClient;//连接套接字structsockaddr_in saServer;//地址信息char*ptr;BOOLfSuccess = TRUE;//WinSock初始化wVersionRequested = MAKEWORD(2, 2);//希望使用的WinSock DLL的版本ret = WSAStartup(wVersionRequested, &wsaData);if(ret!=0){printf("WSAStartup() failed!\n");return;}//确认WinSock DLL支持版本2.2if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2){WSACleanup();printf("Invalid WinSock version!\n");return;}//创建Socket,使用TCP协议sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(sClient == INVALID_SOCKET){WSACleanup();printf("socket() failed!\n");return;}//构建服务器地址信息saServer.sin_family = AF_INET;//地址家族saServer.sin_port = htons(SERVER_PORT);//注意转化为网络节序saServer.sin_addr.S_un.S_addr = inet_addr("192.168.1.127");//连接服务器ret = connect(sClient, (structsockaddr *)&saServer,sizeof(saServer));if(ret == SOCKET_ERROR){printf("connect() failed!\n");closesocket(sClient);//关闭套接字WSACleanup();return;}charsendMessage[]="hello this is client message!";ret = send (sClient, (char*)&sendMessage,sizeof(sendMessage), 0);if(ret == SOCKET_ERROR){printf("send() failed!\n");}elseprintf("client info has been sent!");closesocket(sClient);//关闭套接字WSACleanup();}
码字很辛苦,转载请注明来自はなふぶき博客的《C语言SOCKET通讯学习》
2017-02-17
日志
评论