Tag: 套接字

C中的UDP套接字

我正在为课堂上的家庭作业问题做准备。 我想启动一个侦听文件请求的UDP服务器。 它打开文件并使用UDP将其发送回请求客户端。 这是服务器代码。 // Create UDP Socket if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { perror(“Can’t create socket”); exit(-1); } // Configure socket memset(&server, 0, sizeof server); server.sin_family = AF_INET; // Use IPv4 server.sin_addr.s_addr = htonl(INADDR_ANY); // My IP server.sin_port = htons(atoi(argv[1])); // Server Port // Bind socket if ((bind(sockfd, (struct sockaddr *) […]

c udp带有recvfrom和select的非阻塞套接字

我想在客户端实现具有select函数的非阻塞套接字。 但它没有按预期工作。 在下面的代码中,它永远不会运行到else,rv始终为1,当没有任何内容时,套接字应用程序停止一段时间,并在套接字上有另一条消息时继续。 我不希望这种行为,我希望当socket上没有任何东西要重新发送时,客户端会将消息发送回服务器。 fd_set readfds; fcntl(sd, F_SETFL, O_NONBLOCK); while (1) { FD_ZERO(&readfds); FD_SET(sd, &readfds); rv = select(sd + 1, &readfds, NULL, NULL, NULL); if(rv == 1){ nbytes = recvfrom(sd, buf, RW_SIZE, 0, (struct sockaddr *) &srv_addr, &addrlen); } else { printf(“I’m never here so I can’t send message back to the server!\n”); } } […]

在C中使用大量字符的字节顺序

嘿伙计们,来自C / Networking新手的问题…… 我在C中进行一些套接字编程,并试图解决字节顺序问题。 我的请求(发送)很好,但是当我收到数据时,我的字节都乱了。 我从这样的事情开始…… char * aResponse= (char *)malloc(512); int total = recv(sock, aResponse, 511, 0); 在处理这个响应时,每个16位字似乎都反转了它(我正在使用UDP)。 我试图通过做这样的事来解决这个问题…… unsigned short * _netOrder= (unsigned short *)aResponse; unsigned short * newhostOrder= (unsigned short *)malloc(total); for (i = 0; i < total; ++i) { newhostOrder[i] = ntohs(_netOrder[i]); } 当我将数据视为一个short时,这可以正常工作,但是如果我再次将指针转换为char,则字节会反转。 我究竟做错了什么? 谢谢!

我在哪里获得arpa / inet.h?

问题很简单。 我需要一个工具将char*转换为ip地址并使用它 sockaddr_in.s_addr arpa / inet.h有inet_addr()函数,但是我不确定我是否已经在MS VS 2010安装中的某个地方使用过这个文件,或者我应该在其他地方使用它。

C:“所有客户端连接的相同文件描述符”(客户端服务器编程)

在每个新客户端连接分叉服务器进程 不同的进程(服务器的其他子进程,即exec)无法识别在分叉子进程中使用相同fd的客户端。 如何区分其他进程的客户端? 如果文件描述符是新的sockfd,则accept调用返回相同的值 /* server process */ #include #include #include #include #include #define SIZE sizeof(struct sockaddr_in) void catcher(int sig); int newsockfd; int main(void) { int sockfd; char c; struct sockaddr_in server = {AF_INET, 7000, INADDR_ANY}; static struct sigaction act; act.sa_handler = catcher; sigfillset(&(act.sa_mask)); sigaction(SIGPIPE, &act, NULL); /* set up the transport end point */ […]

solaris中sockets错误EINPROGRESS的可能原因是什么?

Solaris中的套接字错误EINPROGRESS可能原因是什么? 我们如何检查根本原因? tcp api是:connect

调用setsockopt时出错“No such device”

我有一个代码,其中发送多播数据报。 一段重要的代码: uint32_t port; int sockfd, err_ip; const uint32_t sizebuff = 65535 – (20 + 8); unsigned char *buff = (unsigned char *) malloc(sizebuff); struct sockaddr_in servaddr, cliaddr; struct in_addr serv_in_addr; struct ip_mreq req; port = str2uint16(cmdsrv->ipport); bzero(buff, (size_t)sizebuff); bzero(&servaddr, sizeof(servaddr)); bzero(&serv_in_addr, sizeof(serv_in_addr)); err_ip = inet_aton(cmdsrv->ipaddr, &serv_in_addr); if(( err_ip != 0 ) && ( port […]

C套接字发送UDP并处理来自路由器的ICMP应答

我正在尝试将UDP数据包发送到路由器,其生存时间为1,然后接收ICMP超时回复。 到目前为止,我能够发送数据包,但是当我的程序进入执行的recv部分时,它就会挂起。 我有一个错误检查recvfrom,但它甚至没有达到。 我的电脑正在接收请求。 我知道这是因为我在运行程序时运行Wireshark并且我过滤了ICMP请求。 每次我运行程序时,都会收到回复。 我在recvfrom上做错了什么? #include #include #include #include #include #include #include #include #define UNSPEC_PROTO 0 int main(int argc, const char *argv[]) { if (argc != 2) { printf(“usage: routetracer \n”); return -1; } struct addrinfo hints; //params for ret val of getaddrinfo struct addrinfo* ret; //return value of getaddrinfo struct sockaddr* reply_addr; […]

通过套接字传输文件,最终大小用较少的字节

我试图通过C中的套接字接收一些文件。但是服务器向我发送一个100字节文件的64字节数据包,我在目标文件上得到大约999902字节。 while ((n = read(sd, buffer_in, BUFSIZE ))) // BUFSIZE = 64 { if(n<0) { printf("Fail.\n"); fclose(archivo); return -1; } if(fwrite(buffer_in, n, 1, f) !=1 ) { printf("fwrite error.\n"); fclose(archivo); return -1; } bytes+=n; } printf("We received %d bytes", bytes); 当通过本地TCP / IP套接字使用时,它可以工作,但不能以慢速连接。 我通过调试看到我得到了很多64字节的块,并且在EOF附近有一个30字节的块。 我知道你可以在read()上获得更少的字节,因为当任何数据(> 1个字节)可用时调用返回。 但这种情况不应该被暂时抓住? 应该在n == 0时返回,那就是不再有数据(EOF)。 谢谢你的帮助。 (编辑) 发送代码如下: while (n=read(file_fd, […]

哪些客户端情况需要bind()?

我正在学习C套接字编程。 你什么时候在客户端使用bind()? 需要什么类型的程序以及为什么? 我在哪里可以找到一个例子?