Tag: sockets

使用mingw在套接字上的fprintf

在Windows中的一个套接字上有一个有趣的post使用fprintf建议用一个包装器替换fprintf,该包装器将一个格式缓冲区发送到套接字。 但是,似乎可以使用_open_osfhandle将套接字转换为filedescriptor。 #include #include #include #include int main(int argc, char* argv[]) { if (argc < 3) { fprintf(stderr,"usage %s \n”, argv[0]); exit(0); } WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); int port = atoi(argv[2]); struct hostent *server = gethostbyname(argv[1]); if (server == NULL) { fprintf(stderr,”ERROR, no such host\n”); exit(0); } struct sockaddr_in serv_addr; memset(&serv_addr, 0, sizeof(struct sockaddr_in)); […]

C Winsock编程:输入垃圾

我正在编写一个非常简单的套接字服务器,遵循此示例代码 。 服务器启动并运行,我可以通过telnet连接到它(实际上使用Putty)。 每当收到新连接时,我会生成一个新线程,代码如下: DWORD WINAPI receive_cmds(LPVOID lpParam) { char outbuffer[100]; outbuffer[0] = ‘\0’; char inbuffer[100]; inbuffer[0] = ‘\0’; int res; SOCKET current_client = (SOCKET)lpParam; while (1) { res = recv(current_client, inbuffer, sizeof inbuffer – 1, 0); if (res > 0) { inbuffer[res] = ‘\0’; printf(“Got ‘%s’\n”, inbuffer); } Sleep(10); if (res == 0) { […]

套接字数据损坏

我正在研究一个简单的套接字客户端,它向服务器发送一个简单的字母“p”,然后从服务器读取响应。 除了一个令人困惑的问题外,它正在全力以赴。 第一次读取套接字(它发生在循环中)时,数据会出现乱码和损坏,结果如“ÿýÿû”和“μÞv”。 第一次回复后收到的所有数据都很好且有效。 我用来接收的代码是: int n; char buffer[256]; bzero(buffer,256); strcpy(buffer, “p”); n = write(manSock,buffer,256); if (n < 0) { error("ERROR writing to management server"); } bzero(buffer,256); n = read(manSock,buffer,256); if (n < 0) { error("ERROR reading from management server"); } return buffer; manSock是套接字文件描述符。 有关为何发生这种情况的任何想法?

如何循环getprotent()函数

我相信getprotoent()函数从/etc/protocols获取值。 我做了以下示例程序:test.c. 表明 proto.p_name = ip * proto.p_aliases = IP proto.p_proto = 0 这些值与/etc/protocols的第一个条目相同。 我想知道如何获取第二个条目的值,如循环,评估一些指针,不使用getprotobyname()或getprotobynumber() 。 TEST.C #include #include #include int main(int argc,char *argv[]) { protEnt(); } int protEnt() { setprotoent(2); struct protoent proto; proto = *getprotoent(); printf(“proto.p_name = %s\n”,proto.p_name); printf(“*proto.p_aliases = %s\n”,*proto.p_aliases); printf(“proto.p_proto = %d\n”,proto.p_proto); proto = *getprotoent(); endprotoent(); }

原始套接字:接收方打印垃圾值

我正在尝试使用原始套接字使用发送器和接收器程序发送字符数组。 我能够在接收器端获得正确的字节数,但打印出的值是垃圾。 有人可以帮帮我吗? 发射机: int create_raw_socket(char *dev) { struct sockaddr_ll sll; struct ifreq ifr; int fd, ifi, rb; bzero(&sll, sizeof(sll)); bzero(&ifr, sizeof(ifr)); fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); assert(fd != -1); strncpy((char *)ifr.ifr_name, dev, IFNAMSIZ); ifi = ioctl(fd, SIOCGIFINDEX, &ifr); assert(ifi != -1); sll.sll_protocol = htons(ETH_P_ALL); sll.sll_family = AF_PACKET; sll.sll_ifindex = ifr.ifr_ifindex; rb = bind(fd, (struct […]

不断运行服务器套接字

我已经编写了使用TCP套接字在服务器和客户端之间建立连接的代码。我在断开客户端方面遇到了问题。 即使当前客户端关闭,我希望服务器端连续运行等待下一个客户端。 我的客户端代码: int main(int argc, char *argv[]) { int sockfd = 0, n = 0,c; char recvBuff[1024]; struct sockaddr_in serv_addr; if(argc != 2) { printf(“\n Usage: %s \n”,argv[0]); return 1; } memset(recvBuff, ‘0’,sizeof(recvBuff)); if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { printf("\n Error : Could not create socket \n"); return 1; } memset(&serv_addr, '0', […]

C套接字写入添加额外字符

我试图在聊天程序中附加“”消息。 在下面的示例中,buf是保存消息的字符数组。 奇怪的是,当我使用write()向下发送它时,它会以2个突发发送它。 第一个突发是正确的消息,然后第二个突发是2-3个随机的非字母ascii字符。 有什么想法吗? 当我向sockets发送buf时,它可以正常工作。 char nickmsg[550]; strcpy(nickmsg, ” “); strcat(nickmsg, buf); write(sd, nickmsg, sizeof(nickmsg));

无限地运行服务器套接字

我是套接字编程的新手。请给我一些无限运行服务器套接字的技术,即使我在C编程中使用close(clientfd)关闭客户端套接字(服务器必须在accept()中等待下一个客户端连接,即使当前连接已关闭)。 另外请帮助我客户端的close()如何影响服务器端的套接字。

使用select和recv通过套接字从Web服务器获取文件

我在使用C套接字从Web服务器接收“大”文件时遇到问题; 即当这些文件(或我怀疑)大于我用来接收它们的缓冲区的大小时。 如果我试图(通过GET请求)询问一个不大于几个字节的简单index.html ,我会很好,但其他任何事情都会失败。 我假设我对select()或recv()缺乏了解,这让我失望了。 看这里: fd_set read_fd_set; FD_ZERO(&read_fd_set); FD_SET((unsigned int)socketId, &read_fd_set); /* Initialize the timeout data structure. */ struct timeval timeout; timeout.tv_sec = 2; timeout.tv_usec = 0; // Receives reply from the server int headerReceived = 0; do { select(socketId+1, &read_fd_set, NULL, NULL, &timeout); if (!(FD_ISSET(socketId, &read_fd_set))) { break; } byteSize = recv(socketId, buffer, […]

怀疑在c socket程序中定义结构

data_size = recvfrom(sock_raw , buffer , 1024, 0 , &saddr , (socklen_t*)&saddr_size); 这是一个recvfrom函数,我想创建一个’saddr’和’saddr_size’的结构,它在main()声明如下 struct sockaddr saddr; int saddr_size; saddr_size = sizeof saddr; 而不是下面提到的write() api我必须使用struct变量。 int cont= write(logfile,buffer,data_size); 我的问题是:下面我使用了结构。 这是为以下字段定义struct的方法吗? 声明正确吗? 如果不是,请有人指导我纠正它。 struct data{ unsigned char buffer[1024]; unsigned long int saddr; // struct sockaddr saddr; int saddr_size; };