Socket编程笔记

来源:互联网 发布:企业网络改造方案设计 编辑:程序博客网 时间:2024/06/05 21:07

服务端:

步骤如下:

(1)WinSock初始化----WSAStartup();
(2)创建套接字(socket
());
(3)将套接字绑定到一个本地地址和端口上(bind())
(4)将套接字设为监听模式,准备接收客户端请求(listen())
(5)等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept()阻塞接口)
(6)用返回的套接字和客户端进行通信(send / recv)
(7)返回,等待另一个客户请求。
(8)关闭套接字。

代码:

#include <stdio.h>  #include <winsock2.h>  #pragma comment(lib, "Ws2_32.lib")//#define SERVER_PORT 4000 //侦听端口  char file_path[] = "D:\\rec.h264";int main(int argc, char *argv[]){if (argc < 3){printf("Usage : REC IP And Port\n");exit(1);}char *ip = argv[1];int port = atoi(argv[2]);FILE *pFile = fopen(file_path, "wb+");WORD wVersionRequested;WSADATA wsaData;int ret, nLeft, length;SOCKET sListen, sServer; //侦听套接字,连接套接字  struct sockaddr_in saServer, saClient; //地址信息        //WinSock初始化  wVersionRequested = MAKEWORD(2, 2); //希望使用的WinSock DLL 的版本  ret = WSAStartup(wVersionRequested, &wsaData);if (ret != 0){printf("WSAStartup() failed!\n");//return 0;  }//创建Socket,使用TCP协议  sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (sListen == INVALID_SOCKET){WSACleanup();printf("socket() faild!\n");//return 0;  }//构建本地地址信息  saServer.sin_family = AF_INET; //地址家族  saServer.sin_port = htons(port); //注意转化为网络字节序  saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //使用INADDR_ANY 指示任意地址  //绑定  ret = bind(sListen, (struct sockaddr *)&saServer, sizeof(saServer));if (ret == SOCKET_ERROR){printf("bind() faild! code:%d\n", WSAGetLastError());closesocket(sListen); //关闭套接字  WSACleanup();//return 0;  }//侦听连接请求  ret = listen(sListen, 5);if (ret == SOCKET_ERROR){printf("listen() faild! code:%d\n", WSAGetLastError());closesocket(sListen); //关闭套接字  //return 0;  }printf("Waiting for client connecting!\n");while (1){length = sizeof(saClient);sServer = accept(sListen, (struct sockaddr *)&saClient, &length);if (sServer == INVALID_SOCKET){printf("accept() faild! code:%d\n", WSAGetLastError());closesocket(sListen); //关闭套接字  WSACleanup();return 0;}printf("server accept\n");char receiveMessage[5000];char *pRec = receiveMessage;while (1){//接收数据  ret = recv(sServer, receiveMessage, 5000, 0);if (ret == SOCKET_ERROR){printf("recv() failed!\n");return 0;}if (ret == 0) //客户端已经关闭连接  {printf("Client has closed the connection\n");break;}printf("rec frame ret:%d\n",ret);fwrite(pRec, ret, 1, pFile);//存储接收的数据fflush(pFile);}}  closesocket(sListen);    closesocket(sServer);    WSACleanup();    system("pause");  return 0;}


客户端:

步骤如下:

(1)WinSock初始化----WSAStartup();
(2)创建套接字(socket)
(3)向服务器发出连接请求(connect)/UDP不需要此步
(4)和服务器端进行通信(send / recv)
(5)关闭套接字

代码:

#include <stdio.h>  #include <stdlib.h>  #include <winsock2.h>  #pragma comment(lib, "Ws2_32.lib")#define SERVER_PORT 4000 //侦听端口  #define USE_UDP 0char file_path[] = "D:\\rec.h264";int main(){WORD wVersionRequested;WSADATA wsaData;int ret;SOCKET sClient; //连接套接字  struct sockaddr_in saServer; //服务器地址信息  BOOL fSuccess = TRUE;/*FILE *pFile = fopen(file_path,"wb+"); *///WinSock初始化  wVersionRequested = MAKEWORD(2, 2); //希望使用的WinSock DLL的版本  ret = WSAStartup(wVersionRequested, &wsaData);  //加载套接字库  if (ret != 0){printf("WSAStartup() failed!\n");//return 0;  }//确认WinSock DLL支持版本2.2  if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2){WSACleanup();   //释放为该程序分配的资源,终止对winsock动态库的使用  printf("Invalid WinSock version!\n");//return 0;  }//构建服务器地址信息  saServer.sin_family = AF_INET; //地址家族  saServer.sin_port = htons(SERVER_PORT); //注意转化为网络节序  saServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//创建Socket,使用TCP/UDP协议  #if USE_UDPsClient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if (sClient == INVALID_SOCKET){WSACleanup();printf("socket() failed!\n");//return 0;  }#elsesClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (sClient == INVALID_SOCKET){WSACleanup();printf("socket() failed!\n");//return 0;  }//连接服务器  ret = connect(sClient, (struct sockaddr *)&saServer, sizeof(saServer));if (ret == SOCKET_ERROR){printf("connect() failed!\n");printf("socket error! : %d", WSAGetLastError());closesocket(sClient); //关闭套接字  WSACleanup();//return 0;  }#endifchar sendMessage[] = "send test";while (1){ret = send(sClient, (char *)&sendMessage, sizeof(sendMessage), 0);if (ret == SOCKET_ERROR){printf("send() failed!\n");}elseprintf("client info has been sent!\n");Sleep(1000);}/*char recvBuf[256];memset(recvBuf,0,sizeof(char));int len = recv(sClient, recvBuf, 256, 0);char *tmp = new char[len];memcpy(tmp, recvBuf, len);printf("%s\n", tmp);*//*fwrite(recvBuf, sizeof(unsigned char), len, pFile);fflush(pFile);*/closesocket(sClient); //关闭套接字  WSACleanup();system("pause");//return 0;  }
参考