C语言的Socket编程例子(TCP和UDP)

论坛 期权论坛 脚本     
匿名技术用户   2021-1-2 20:04   22   0

<TCP>

server端:

  1. #include "stdafx.h"
  2. #include <stdio.h>
  3. #include <winsock2.h>
  4. #pragma comment(lib,"ws2_32.lib")
  5. int main(int argc, char* argv[])
  6. {
  7. //初始化WSA
  8. WORD sockVersion = MAKEWORD(2,2);
  9. WSADATA wsaData;
  10. if(WSAStartup(sockVersion, &wsaData)!=0)
  11. {
  12. return 0;
  13. }
  14. //创建套接字
  15. SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  16. if(slisten == INVALID_SOCKET)
  17. {
  18. printf("socket error !");
  19. return 0;
  20. }
  21. //绑定IP和端口
  22. sockaddr_in sin;
  23. sin.sin_family = AF_INET;
  24. sin.sin_port = htons(8888);
  25. sin.sin_addr.S_un.S_addr = INADDR_ANY;
  26. if(bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
  27. {
  28. printf("bind error !");
  29. }
  30. //开始监听
  31. if(listen(slisten, 5) == SOCKET_ERROR)
  32. {
  33. printf("listen error !");
  34. return 0;
  35. }
  36. //循环接收数据
  37. SOCKET sClient;
  38. sockaddr_in remoteAddr;
  39. int nAddrlen = sizeof(remoteAddr);
  40. char revData[255];
  41. while (true)
  42. {
  43. printf("等待连接...\n");
  44. sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen);
  45. if(sClient == INVALID_SOCKET)
  46. {
  47. printf("accept error !");
  48. continue;
  49. }
  50. printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));
  51. //接收数据
  52. int ret = recv(sClient, revData, 255, 0);
  53. if(ret > 0)
  54. {
  55. revData[ret] = 0x00;
  56. printf(revData);
  57. }
  58. //发送数据
  59. char * sendData = "你好,TCP客户端!\n";
  60. send(sClient, sendData, strlen(sendData), 0);
  61. closesocket(sClient);
  62. }
  63. closesocket(slisten);
  64. WSACleanup();
  65. return 0;
  66. }


client端:

  1. #include "stdafx.h"
  2. #include <WINSOCK2.H>
  3. #include <STDIO.H>
  4. #pragma comment(lib,"ws2_32.lib")
  5. int main(int argc, char* argv[])
  6. {
  7. WORD sockVersion = MAKEWORD(2,2);
  8. WSADATA data;
  9. if(WSAStartup(sockVersion, &data) != 0)
  10. {
  11. return 0;
  12. }
  13. SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  14. if(sclient == INVALID_SOCKET)
  15. {
  16. printf("invalid socket !");
  17. return 0;
  18. }
  19. sockaddr_in serAddr;
  20. serAddr.sin_family = AF_INET;
  21. serAddr.sin_port = htons(8888);
  22. serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
  23. if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
  24. {
  25. printf("connect error !");
  26. closesocket(sclient);
  27. return 0;
  28. }
  29. char * sendData = "你好,TCP服务端,我是客户端!\n";
  30. send(sclient, sendData, strlen(sendData), 0);
  31. char recData[255];
  32. int ret = recv(sclient, recData, 255, 0);
  33. if(ret > 0)
  34. {
  35. recData[ret] = 0x00;
  36. printf(recData);
  37. }
  38. closesocket(sclient);
  39. WSACleanup();
  40. return 0;
  41. }


二. <UDP>

SERVER 端

  1. #include "stdafx.h"
  2. #include <stdio.h>
  3. #include <winsock2.h>
  4. #pragma comment(lib, "ws2_32.lib")
  5. int main(int argc, char* argv[])
  6. {
  7. WSADATA wsaData;
  8. WORD sockVersion = MAKEWORD(2,2);
  9. if(WSAStartup(sockVersion, &wsaData) != 0)
  10. {
  11. return 0;
  12. }
  13. SOCKET serSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  14. if(serSocket == INVALID_SOCKET)
  15. {
  16. printf("socket error !");
  17. return 0;
  18. }
  19. sockaddr_in serAddr;
  20. serAddr.sin_family = AF_INET;
  21. serAddr.sin_port = htons(8888);
  22. serAddr.sin_addr.S_un.S_addr = INADDR_ANY;
  23. if(bind(serSocket, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
  24. {
  25. printf("bind error !");
  26. closesocket(serSocket);
  27. return 0;
  28. }
  29. sockaddr_in remoteAddr;
  30. int nAddrLen = sizeof(remoteAddr);
  31. while (true)
  32. {
  33. char recvData[255];
  34. int ret = recvfrom(serSocket, recvData, 255, 0, (sockaddr *)&remoteAddr, &nAddrLen);
  35. if (ret > 0)
  36. {
  37. recvData[ret] = 0x00;
  38. printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));
  39. printf(recvData);
  40. }
  41. char * sendData = "一个来自服务端的UDP数据包\n";
  42. sendto(serSocket, sendData, strlen(sendData), 0, (sockaddr *)&remoteAddr, nAddrLen);
  43. }
  44. closesocket(serSocket);
  45. WSACleanup();
  46. return 0;
  47. }


CLIENT 端

  1. #include "stdafx.h"
  2. #include <stdio.h>
  3. #include <winsock2.h>
  4. #pragma comment(lib, "ws2_32.lib")
  5. int main(int argc, char* argv[])
  6. {
  7. WORD socketVersion = MAKEWORD(2,2);
  8. WSADATA wsaData;
  9. if(WSAStartup(socketVersion, &wsaData) != 0)
  10. {
  11. return 0;
  12. }
  13. SOCKET sclient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  14. sockaddr_in sin;
  15. sin.sin_family = AF_INET;
  16. sin.sin_port = htons(8888);
  17. sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
  18. int len = sizeof(sin);
  19. char * sendData = "来自客户端的数据包.\n";
  20. sendto(sclient, sendData, strlen(sendData), 0, (sockaddr *)&sin, len);
  21. char recvData[255];
  22. int ret = recvfrom(sclient, recvData, 255, 0, (sockaddr *)&sin, &len);
  23. if(ret > 0)
  24. {
  25. recvData[ret] = 0x00;
  26. printf(recvData);
  27. }
  28. closesocket(sclient);
  29. WSACleanup();
  30. return 0;
  31. }

http://www.cnblogs.com/zjutlitao/p/3622030.html
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP