Пример работы с сокетами для Windows

Пример работы с сокетами для Windows

Пример работы с сокетами для Windows

Писал, когда сам разбирался с этим делом. На базе этого
простого примера написано (точнее не совсем на его
базе, а скорее при его участии) пара серьезных
программок.

Все просто, как в танке. По исходникам разберетесь.

makefile

  1. all: socket.cpp config.h socket.h
  2. $(CC) socket.cpp

Download this code: makefile.txt

socket.cpp

  1. #include "stdio.h";
  2. #include "socket.h";
  3. #include "config.h";
  4.  
  5. static char Rec[2048000];
  6.  
  7. bool SendString(SOCKET s,char* str) {
  8. int cnt=send(s,str,strlen(str),0);
  9. if (cnt==SOCKET_ERROR) return(false); else return(true);
  10. }
  11.  
  12. char* GetString(SOCKET s) {
  13. char *str;
  14. char InBuff[2048];
  15. int cnt;
  16.  
  17. strcpy("",Rec);
  18. while (cnt!=0) {
  19. memset(&InBuff,0,2048);
  20. cnt=recv (s, (char*)&InBuff, sizeof(InBuff),0);
  21. strcat(Rec,InBuff);
  22. }
  23. return((char*)&Rec);
  24. }
  25.  
  26.  
  27. int OpenURL(char *url) {
  28. char *none="";
  29. char query[2048];
  30. struct sockaddr_in ssin;
  31. struct hostent* hp;
  32. unsigned char strHlp[2048], *pch;
  33. int PortNum;
  34. char *http_host;
  35. char *http_path;
  36.  
  37. if (memcmp(url,"HTTP://",7)!=0 && memcmp(url,"http://",7)!=0) return(7);
  38. url+=7;
  39. if (WSAStartup(MAKEWORD(1,1),&lpWSAData)!=0) return(1);
  40. // ЁбЇ®«м§гЉ¬ Default'®ўл© ­®¬Ља Ї®ав  - 80, Љб«Ё ­Љ § ¤ ­ ¤агЈ®©
  41. strcpy(strHlp,url);
  42. pch = strchr((char*)strHlp,':');
  43. if (pch==NULL) {
  44. PortNum = 80;
  45. pch = strchr((char*)strHlp,'/');
  46. if (pch!=NULL) {
  47. pch[0] = '\0';
  48. http_path=pch+1;
  49. }
  50. else {
  51. http_path=none;
  52. }
  53. }
  54. else {
  55. pch[0] = '\0';
  56. pch++;
  57. char *pch1 = strchr((char*)pch,'/');
  58. if (pch1!=NULL) {
  59. pch1[0] = '\0';
  60. http_path=pch1+1;
  61. }
  62. else {
  63. http_path=none;
  64. }
  65. PortNum = atoi(pch);
  66. if(PortNum==0) PortNum = 80;
  67. }
  68.  
  69. // Џ®гз Љ¬ IP Ї® Ё¬Љ­Ё
  70. if ((hp=gethostbyname(strHlp))==NULL) return(1);
  71. http_host=strHlp;
  72.  
  73. memset ((char *)&ssin, 0, sizeof(ssin));
  74. ssin.sin_family = AF_INET;
  75. ssin.sin_addr.s_addr = htonl(INADDR_ANY);
  76. ssin.sin_port = 0;
  77. bind (s, (struct sockaddr *)&ssin, sizeof(ssin));
  78.  
  79. s=socket(AF_INET, SOCK_STREAM, 0);
  80. if (s==INVALID_SOCKET) return(4);
  81.  
  82. ssin.sin_family = AF_INET;
  83. ssin.sin_addr.S_un.S_un_b.s_b1 = hp->h_addr[0];
  84. ssin.sin_addr.S_un.S_un_b.s_b2 = hp->h_addr[1];
  85. ssin.sin_addr.S_un.S_un_b.s_b3 = hp->h_addr[2];
  86. ssin.sin_addr.S_un.S_un_b.s_b4 = hp->h_addr[3];
  87. ssin.sin_port = htons(PortNum);
  88.  
  89. printf("Conecting to %d.%d.%d.%d...",(unsigned char)hp->h_addr[0],(unsigned char)hp->h_addr[1],(unsigned char)hp->h_addr[2],(unsigned char)hp->h_addr[3]);
  90. if (connect(s, (sockaddr *)&ssin, sizeof(ssin))==-1) return(3);
  91. printf("Ok\n");
  92.  
  93. strcpy(query,"GET /");
  94. strcat(query,http_path);
  95. strcat(query," HTTP/1.0\nHost: ");
  96. strcat(query,http_host);
  97. strcat(query,"\nUser-agent: ");
  98. strcat(query,http_user_agent);
  99. strcat(query,"\nAccept: */*\n\n");
  100.  
  101. printf("%s",query);
  102.  
  103. if (!SendString(s,query)) return(5);
  104. char* str=GetString(s);
  105. printf("%s",str);
  106. return(0);
  107. }
  108.  
  109. void CloseURL(void) {
  110. WSACleanup();
  111. }
  112.  
  113. void main(void) {
  114. int err=OpenURL("http://www.codenet.ru/");
  115. if (err!=0) {
  116. printf("Error #%d: WSABASEERR+%d\n",err,WSAGetLastError()-WSABASEERR);
  117. }
  118. }

Download this code: socket.cpp

config.h

Этот модуль содержит настройки…точнее одну настройку — то что сервер получит
в качестве HTTP_USER_AGENT.

  1. char *http_user_agent="Search Engine";

Download this code: config.h

socket.h

  1. #include <windows.h>
  2.  
  3. int s;
  4. WSADATA lpWSAData;

Download this code: socket.h

Комментарии