我是Unix网络的新手,我无法理解我的代码有什么问题。我已经研究了很多,逻辑上代码应该可以工作,但我现在正在把头发拉出来。客户端连接调用不断引发错误 - 将errno
设置为22
。我不明白连接参数的方式有什么问题。
客户端代码是:
#include <netinet/in.h>
#include <sys/select.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdint.h>
#include <strings.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
int main(int argc, char *argv[])
{
char buffer[256];
uint32_t
serverip=; //ip goes here
struct sockaddr_in clientsock;
memset(&clientsock, 0, sizeof(clientsock));
clientsock.sin_family = AF_INET;
clientsock.sin_addr.s_addr = htonl(serverip);
clientsock.sin_port = htons((unsigned short) 5000);
socklen_t clientsocksize = sizeof(clientsock);
int clientfd = socket(AF_INET, SOCK_STREAM, 0);
int retval = -1;
retval = connect(clientfd, (struct sockaddr*) &clientsock,
sizeof(struct sockaddr_in));
while (1)
{
if (retval == -1)
{
printf("error while connecting...\n");
printf("error: %i\n", errno);
retval = connect(clientfd, (struct sockaddr*) &clientsock,
sizeof(struct sockaddr_in));
}
else if (retval == 0)
{
printf("connection returned: %i\n", retval);
printf("please enter data: ");
bzero((char *) &buffer, sizeof(buffer));
fgets(buffer, 255, stdin);
write(clientfd, buffer, sizeof(buffer));
}
else
{
printf("error in else: %i\n", errno);
}
}
}
任何指导和批评都将不胜感激。
答案 0 :(得分:0)
Errno 22是EINVAL
,这意味着您传递给connect
的一些参数无效。可能的错误之一是您将sockaddr设置为分配给uint32_t
:
uint32_t serverip=; //ip goes here
clientsock.sin_addr.s_addr = htonl(serverip);
什么是serverip?你怎么得到的?通常,您应该调用getaddrinfo
或inet_pton
将主机名或点缀的ip字符串转换为sockaddr.sin_addr
。例如,如果您使用getaddrinfo
,则可以使用它直接返回的sockaddr
:
connect(clientfd, res->ai_addr, res->ai_addrlen);
或者如果您使用inet_pton
,
inet_pton(AF_INET, ipstr, &clientsock.sin_addr.s_addr);
此外,检查socket
任何错误的返回值最好:
int clientfd = socket(AF_INET, SOCK_STREAM, 0);
if (clientfd < 0) {
// error
exit(1);
}