如下代码,很简单.但是就是执行到
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;
}
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;
}
看看,还有错把
if (sock <0) {
printf("error : %d\n", WSAGetLastError());
closesocket(sock0);
return 1;
}的error :贴出来看看
printf("error : %d\n", WSAGetLastError());
closesocket(sock0);
return 1;
} 原来这句是这样的...
后来我嫌麻烦,直接就改了一下下. 现在是不执行到这句就挂了.
2楼的兄台,能不能把捕捉异常时要include的头文件给我一下或者直接帮忙把一小段捕捉的代码给我?try{
sock = accept(sock0, (struct sockaddr *)&client, &len);
}catch(????){????
}
即使就在这句下边加一句
printf("test");
也不能执行.
这是阻塞式的socket编程.
程序运行到 sock = accept(sock0, (struct sockaddr *)&client, &len);
被阻塞.
直到有一个客户端connect连接进来, accept()才会返回,程序才会继续运行.
代码:
运行环境: 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;
}
哈,准备结账给分.等我吃完早餐.
listen(sock0, 5);这两个函数,特别是BIND,都需要检查返回,因为可能失败的[3] len = sizeof(client);
你改成 len=sizeof(struct sockaddr)[4] SOCKET是不会抛出异常的,引发异常的是其他代码,而不是SOCKET函数导致