如下代码,很简单.但是就是执行到
sock = accept(sock0, (struct sockaddr *)&client, &len);
时就出错. 
或许哪位XDJM可以告诉我怎么捕捉这个异常.VS2008
console application
lib: ws2_32.lib#include <stdio.h>
#include <winsock2.h>int
main()
{
 WSADATA wsaData;
 SOCKET sock0;
 struct sockaddr_in addr;
 struct sockaddr_in client;
 int len;
 SOCKET sock;
 WSAStartup(MAKEWORD(2,0), &wsaData); // sock0 create
  sock0 = socket(AF_INET, SOCK_STREAM, 0);
  printf("\nhello world !!!!\n"); if (sock0 == INVALID_SOCKET) {
        printf("error : %d\n", WSAGetLastError());
        return 1;
 }
   
 addr.sin_family = AF_INET;
 addr.sin_port = htons(12345);
 addr.sin_addr.S_un.S_addr = INADDR_ANY;
 bind(sock0, (struct sockaddr *)&addr, sizeof(addr)); // TCP wait from client
 listen(sock0, 5); // TCP accept from  client 
 len = sizeof(client);  sock = accept(sock0, (struct sockaddr *)&client, &len);  if (sock <0) {
        printf("error : %d\n", WSAGetLastError());
closesocket(sock0);
        return 1;
 }
 
 // 文字送信
 send(sock, "HELLO", 5, 0); // TCP session over
 closesocket(sock); // winsock2 clean
 WSACleanup(); return 0;
}

解决方案 »

  1.   

    这段代码没什么问题。捕获异常可以用__try...__except或者用try...catch。
      

  2.   

    WSAStartup(MAKEWORD(2,2), &wsaData);
    看看,还有错把
    if (sock <0) {
            printf("error : %d\n", WSAGetLastError());
            closesocket(sock0);
            return 1;
         }的error :贴出来看看
      

  3.   

    if (sock == INVALID_SOCKET) {
            printf("error : %d\n", WSAGetLastError());
    closesocket(sock0);
            return 1;
     } 原来这句是这样的...
    后来我嫌麻烦,直接就改了一下下. 现在是不执行到这句就挂了.
    2楼的兄台,能不能把捕捉异常时要include的头文件给我一下或者直接帮忙把一小段捕捉的代码给我?try{
    sock = accept(sock0, (struct sockaddr *)&client, &len);
    }catch(????){????
    }
      

  4.   

    sock = accept(sock0, (struct sockaddr *)&client, &len); 执行完这一句整个main都挂掉了. 
    即使就在这句下边加一句
    printf("test"); 
    也不能执行.
      

  5.   

    原因:
    这是阻塞式的socket编程.
    程序运行到 sock = accept(sock0, (struct sockaddr *)&client, &len); 
    被阻塞.
    直到有一个客户端connect连接进来, accept()才会返回,程序才会继续运行.
      

  6.   

    嗯,我今天早上也知道问题所在了.运行一个client 的socket 让它跟server的连接上就好了.
    代码:
    运行环境: vs2008
    工程:console application
    添加lib:ws2_32.lib
    server端
    #include <winsock2.h>int
    main()
    {
     WSADATA wsaData;
     SOCKET sock0;
     struct sockaddr_in addr;
     struct sockaddr_in client;
     int len;
     SOCKET sock; // winsock2の初期化
     WSAStartup(MAKEWORD(2,0), &wsaData); // ソケットの作成
     sock0 = socket(AF_INET, SOCK_STREAM, 0);
    if (sock0 == INVALID_SOCKET) {
    printf("socket failed\n");
    return 1;
     } // ソケットの設定
     addr.sin_family = AF_INET;
     addr.sin_port = htons(12345);
     addr.sin_addr.S_un.S_addr = INADDR_ANY;
     bind(sock0, (struct sockaddr *)&addr, sizeof(addr)); // TCPクライアントからの接続要求を待てる状態にする
     listen(sock0, 5); // TCPクライアントからの接続要求を受け付ける
     len = sizeof(client);
     sock = accept(sock0, (struct sockaddr *)&client, &len); // 5文字送信
     send(sock, "HELLO", 5, 0); // TCPセッションの終了
     closesocket(sock); // winsock2の終了処理
     WSACleanup(); return 0;
    }client端#include <stdio.h>
    #include <winsock2.h>int
    main()
    {
     WSADATA wsaData;
     struct sockaddr_in server;
     SOCKET sock;
     char buf[32]; // winsock2の初期化
     WSAStartup(MAKEWORD(2,0), &wsaData); // ソケットの作成
     sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == INVALID_SOCKET) {
    printf("socket failed\n");
    return 1;
     } // 接続先指定用構造体の準備
     server.sin_family = AF_INET;
     server.sin_port = htons(12345);
     server.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); // サーバに接続
     connect(sock, (struct sockaddr *)&server, sizeof(server)); // サーバからデータを受信
     memset(buf, 0, sizeof(buf));
     int n = recv(sock, buf, sizeof(buf), 0); printf("%d, %s\n", n, buf); // winsock2の終了処理
     WSACleanup(); return 0;
    }
    哈,准备结账给分.等我吃完早餐.
      

  7.   

    [1]  WSAStartup(MAKEWORD(2,0), &wsaData);   -> WSAStartup(MAKEWORD(2,2), &wsaData); [2]  bind(sock0, (struct sockaddr *)&addr, sizeof(addr)); // TCP wait from client
     listen(sock0, 5);这两个函数,特别是BIND,都需要检查返回,因为可能失败的[3] len = sizeof(client);
        你改成 len=sizeof(struct sockaddr)[4] SOCKET是不会抛出异常的,引发异常的是其他代码,而不是SOCKET函数导致