- 论坛徽章:
- 0
|
各位,小弟刚刚接触了linux下的网络编程中的线程编程,最近编写了一个C/S简单模型程序,却始终实现不了功能:
client.c如下:
int main(int argc,char **argv)
{
int sockfd;
struct sockaddr_in servaddr;
pthread_t tid;
int ret;
if(argc!=2)
{
printf("usage:tcpcli" ;
exit(0);
}
//printf("1\n" ;
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(SERV_PORT);
inet_pton(AF_INET,argv[1],&servaddr.sin_addr);
connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
//printf("2\n" ;
str_cli(stdin,sockfd);
exit(0);
}
server.c主函数如下:
int main(int argc,char **argv)
{
int listenfd,connfd;
socklen_t addrlen,len;
struct sockaddr_in cliaddr,servaddr;
pthread_t tid;
int i;
listenfd=socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=SERV_PORT;
i=bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
if(i!=0)
{
printf("bind error!\n" ;
return;
}
listen(listenfd,20);
addrlen=sizeof(cliaddr);
bzero(&cliaddr,sizeof(cliaddr));
for(;
{
len=addrlen;
printf("1\n" ;
connfd=accept(listenfd,(struct sockaddr *)&cliaddr,&addrlen);
// if(connfd==INVALID_SOCKET)
//{
// break;
//}
printf("2\n" ;
pthread_create(&tid,NULL,&doit,(void *)connfd);
pthread_join(tid,NULL);
}
}
在客户端的命令如下:./client 127.0.0.1(本机内部循环测试),但是用printf测试程序,发现server主函数会一直阻塞在accept函数中,即使在客户端的connect已经成功返回的情况下,accept也是会阻塞。在最后一次握手不是客户端接受到服务器的同步信号并且回应就可以建立连接吗?连connect都成功返回了,应该accpet就可以收到一个连接序列了吧?为什么会被一直阻塞呢? |
|