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; }参考
阅读全文
0 0
- C# Socket编程笔记
- C# Socket编程笔记
- C# Socket编程笔记
- C# Socket编程笔记
- socket 编程笔记
- C# Socket编程笔记
- C# Socket编程笔记
- socket 编程笔记
- C# Socket编程笔记
- C# Socket编程笔记
- C# Socket编程笔记
- C# Socket编程笔记
- socket编程学习笔记
- C# Socket编程笔记
- C# Socket编程笔记
- Java Socket编程笔记
- C# Socket编程笔记
- Socket编程笔记
- c运行模型
- 体绘制传输函数-分类(Volume Rendering Transfer function:Pre- VS Post-Classification)
- nagios 报错Warning: Could not stat() check result file '/var/log/nagios/spool/checkresults'.解决
- maven 无法看到源码
- Spring boot 配置jackson 反序列化时间格式、忽略实体中没有的属性
- Socket编程笔记
- Eclipse中如何快速查看jar包中的class源码
- 采用DevOps的成功案例
- h5开篇
- android 自定义动画 圆呼吸效果 ValueAnimator
- Selenium + Java 做 WEB GUI 自动化测试中提升代码质量的方法
- python django整理(五)配置favicon.ico,解决警告Not Found: /favicon.ico
- Python paramiko 简单应用-分析Linux上的文本信息
- 控制台2048