UbuntuTCP/IP通讯Connection refused

yinshi2012 2011-11-03 03:00:23
本人初试Linux编程,根据书写了个小C/S例子,如下
server

#include<sys/types.h>
#include<sys/socket.h>
#include<netdb.h>
#include<netinet/in.h>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>

int main( int argc, char *argv[] )
{
int server_sockfd,client_sockfd;
int server_len,client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;
//建立Socket
server_sockfd=socket(AF_INET,SOCK_STREAM,0);
if(server_sockfd<0)
printf("Create FAlSE\n");
printf("server_sockfd:%d\n",server_sockfd);
//端口号等
server_address.sin_family=AF_INET;
server_address.sin_port=htons(12345);
server_address.sin_addr.s_addr=htonl(INADDR_ANY);
server_len=sizeof(server_address);
//绑定
int bindinfo=bind(server_sockfd,(struct sockaddr *)&server_address,server_len);
printf("bind:%d\n",bindinfo);
//监听
int listeninfo=listen(server_sockfd,5);
printf("listen:%d\n",listeninfo);
//等待客户端链接
printf("server waiting\n");
client_len=sizeof(client_address);
client_sockfd=accept(server_sockfd,(struct sockaddr *)&client_address,&client_len);
printf("client_sockfd:%d\n",client_sockfd);
//收到数据并返回
char str[100];
int tmp=read(client_sockfd,str,100);
str[tmp]=0;
printf("read:%s\n",str);
write(client_sockfd,str,tmp);
close(client_sockfd);
close(server_sockfd);
//退出
//return 0;
exit(0);
}

client

#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>
#include<stdio.h>
#include<errno.h>
#include<stdlib.h>

int main( int argc, char *argv[] )
{
int conn_sockfd;
int conn_len;
struct sockaddr_in conn_address;
//Create Socket
conn_sockfd=socket(AF_INET,SOCK_STREAM,0);
//IP Port so on
conn_address.sin_family=AF_INET;
conn_address.sin_port=htons(12345);
conn_address.sin_addr.s_addr=inet_addr("127.0.0.1");
conn_len=sizeof(conn_address);
//connect
int conninfo=connect(conn_sockfd,(struct sockaddr *)&conn_address,conn_len);
printf("connect:%d\n",conninfo);
if(conninfo!=0) {
printf("errno:%s\n",strerror(errno));
return 1;
}
//recv send
send(conn_sockfd,argv[1],strlen(argv[1]),0);
char str[100];
int num=recv(conn_sockfd,str,100,0);
str[num]=0;
printf("recv[%d]:%s\n",num,str);
//close
close(conn_sockfd);
//return 0;
exit(0);
}

非常简单,但却出现了问题。我开启两个终端,先启动服务程序,后启动客户端程序,第一次执行一切正常。但是当我再次启动服务程序后,启动客户端程序会出现connect链接不成功的情况“Connection refused”,并且启动多次都这样。这时只有使用ctrl+c中断服务器程序,重启服务器程序,客户端程序才会链接成功。
服务器和客户端程序退出时明明close了,为什么会这样,我想知道。望指明。
...全文
241 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
yinshi2012 2011-11-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qq120848369 的回复:]

服务端setsockopt(SOL_SOCKET,SO_REUSEADDR),否则监听端口挂掉后处于time_wait无法重用。
[/Quote]
弄好了,多谢。看来我手里的那本不行。
有没有适合初学者的Linux编程的书呢,推荐一下。
qq120848369 2011-11-03
  • 打赏
  • 举报
回复
服务端setsockopt(SOL_SOCKET,SO_REUSEADDR),否则监听端口挂掉后处于time_wait无法重用。
qiuxin315 2011-11-03
  • 打赏
  • 举报
回复
你的服务端没有循环,怎么第二次接受连接?

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧