socket in C (windows platform)

基本上在離開大學之後,就再也沒有寫過C了,但因為之前有一點很簡單的東西想用c來試一下,所以就很快地寫了個C socket program出來作出測試,當然多年前在課堂上學過的東西, 現在己經忘記了, 雖然在網上很快就可以找到問題的所在,但還是在這裏記一下,留一個記錄比較好..

首先,需要加上以下的code:
#ifdef WIN32
 #include <winsock2.h> 
#else
 #include <sys/socket.h>
 #include <sys/un.h>
#endif

用上這種寫法就可以保證了無論是否windows platform都能連繫上正確的library來呼叫socket 的function.

不過在windows 的環境下,在開socket前,是需要先call WSAStartup 的,否則call socket時便會連不上了

  WSADATA wsaData;
  int ws_result = WSAStartup(0x202, &wsaData);

除了這一點外,還有WSAGetLastError 都是很有用的, 因為它是會把return 連絡不上的error code
int e = WSAGetLastError();

sample program to check port on different protocol
#include <stdio.h>
#ifdef WIN32
 #include <winsock2.h> 
#else
 #include <sys/socket.h>
 #include <sys/un.h>
#endif

#define TESTHOST "x.x.x.x"
#define TESTPORT x

int main(int argc, char * argv[])
{
 char buffer[8193]; 
 int mysocket, len; 
 struct sockaddr_in dest;
   
 WSADATA wsaData;
 int ws_result = WSAStartup(0x202, &wsaData);
 
        // TCP/UDP
 if (argc > 1){
 mysocket = socket(AF_INET, SOCK_STREAM, 0);
 printf("Using SOCK_STREAM\r\n");
 } else {
 mysocket = socket(AF_INET, SOCK_DGRAM, 0);
 printf("Using SOCK_DGRAM\r\n");
 }
 
 printf("mysocket = %d\r\n", mysocket);
 memset(&dest, 0, sizeof(dest));
 dest.sin_family = AF_INET;
 dest.sin_addr.s_addr = inet_addr(TESTHOST);
 dest.sin_port = htons(TESTPORT);
 
 int result = connect(mysocket, (struct sockaddr *)&dest, sizeof(dest));
 printf("host : %s\r\n",TESTHOST);
 printf("port : %d\r\n", TESTPORT); 
 printf("connection result = %d\r\n", result);
 
 int e = WSAGetLastError();
 printf("due to = %d\r\n", e );
 
 if (result >= 0){
  printf("connected!\r\n");
 } else {
  printf("FAIL!!!!!\r\n");
 }
 
 close(mysocket);
 WSACleanup();
}

0 回應:

Post a Comment