我的TCP/IP客户端在写入套接字时卡住了。即使服务器使用
如何避免同步输出的卡顿?或者说我做错了什么,导致
我应该使用
我正在使用两个线程的单独应用程序测试网络功能。主线程启动服务器线程,接受连接并立即关闭它。然后,主线程模拟客户端行为,连接到侦听端口。
主线程代码:
close()
(或shutdown()
)调用正常关闭已接受的连接,这种情况仍会发生。我一直以为在这种情况下,write应该返回ECONNRESET错误。如何避免同步输出的卡顿?或者说我做错了什么,导致
write()
没有报错?我应该使用
send()
而不是write()
,还是它们可以互换使用?我正在使用两个线程的单独应用程序测试网络功能。主线程启动服务器线程,接受连接并立即关闭它。然后,主线程模拟客户端行为,连接到侦听端口。
主线程代码:
sockaddr_in serv_addr;
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(port);
int s = socket(AF_INET, SOCK_STREAM, 0);
if (bind(s, (sockaddr*)(&serv_addr), sizeof(serv_addr)) < 0) {
close(s);
throw runtime_error(strerror(errno));
}
listen(s,1);
start_thread(s); // posix thread accepting a connection on s is started here
//Code below imitates TCP/IP client
struct hostent *hp;
struct sockaddr_in addr;
if((hp = gethostbyname(host.c_str())) == NULL){
throw HErrno();
}
bcopy(hp->h_addr, &addr.sin_addr, hp->h_length);
addr.sin_port = htons(port);
addr.sin_family = AF_INET;
int _socket = ::socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (_socket < 0) {
throw Errno();
}
assert(ENOTCONN==107);
assert(_socket>=0);
if(::connect(_socket, (const struct sockaddr *)&addr, sizeof(struct sockaddr_in)) == -1){
throw Errno();
}
while(true) {
const char a[] = "pattern";
if (write( _socket, a, 7)<0) // Writes 30000 times, then hangs
break;
}
服务器线程代码:
int connection = accept(s);
close(connection);
编辑: 问题是由于我的编程错误导致的。看起来我没有正确地启动接受线程。