一个简单的TCP流程,socket客户端的connect为什么怎么总链接失败啊,不明白为啥,下面是源码
客户端:
int main(int argc, char** argv)
{
int sockfd;
int n;
char recvline[4096],sendline[4096];
struct sockaddr_in addr;
#if 0
if(argc != 2){
printf("usage:./clent<ipaddres>\n");
return -1;
}
#endif
if(sockfd = socket(AF_INET,SOCK_STREAM,0) < 0){
printf("socket created failed.\n");
return -1;
}
memset(&addr, 0, sizeof(addr));
addr.sin_port = htons(4094);
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
if(connect(sockfd, (struct sockaddr*)&addr, sizeof(addr)) < 0){
printf("connect failed.\n");
return -1;
}
printf("send msg to server:\n");
fgets(sendline, 4096, stdin);
if(send(sockfd, sendline, strlen(sendline), 0) < 0){
printf("send server msg error:%s(error:%d)",strerror(errno),errno);
return -1;
}
close(sockfd);
return 0;
}
服务器端
int main(int argc, const char *argv[])
{
int serverfd;
int connfd;
int n;
char buff[4096];
serverfd = socket(AF_INET,SOCK_STREAM,0);
if(serverfd < 0){
printf("Socket created failed.\n");
return -1;
}
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
addr.sin_port = htons(4094);
if(bind(serverfd,(struct sockaddr*)&addr, sizeof(addr)) < 0){
printf("bind failed,\n");
return -1;
}
if(listen(serverfd, 10) < 0){
printf("listened failed.\n");
return -1;
}
printf("======waiting for clent's request========\n");
while(1){
if((connfd = accept(serverfd, (struct sockaddr*)NULL, NULL)) < 0){
printf("accept failed,\n");
return -1;
}
n = recv(connfd, buff, 4096, 0);
buff[n] = '\0';
printf("recv from clent: %s\n",buff);
close(connfd);
}
close(serverfd);
}
我查看端口是属于监听状态
抱歉抱歉我写错了,我客户端的sockfd赋值的时候没加()。抱歉,麻烦大家了.
以下答案由GPT-4.0Plus大模型与博主A努力中.......共同编写:
根据源码,我的分析如下:
综上,连接失败的原因可能是:服务器端程序未启动、目标IP地址错误、防火墙阻止、端口被占用、多线程问题、系统最大文件数限制、网络连接故障等。我建议按以上检查步骤进行排查,定位并解决导致连接失败的根本原因。
serverfd = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
不要写0,0是IP协议
之前我们在谈论进程间通信的时候,说到过一种实现进程间通信的机制,就是socket套接字,那么socket到底是什么呢?
来看看百度百科的解释:
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。建立网络通信连接至少要一对socket。socket本质是编程接口(API)
在网络中我们利用IP地址+端口号来表示网络中的唯一一个进程,所以IP地址+端口号就称为socket