Tag: 套接字

C中的WinSock程序仅适用于本地计算机

我是网络编程的新手,开始学习如何在C中使用WinSock。 我现在对网络没有任何了解。 无论如何,我使用WinSock为Client和Server编写了以下代码。 服务器: #include #include #include #include #define MY_ERROR 1 #define PORT 7777 #define MAX_NUM_CLIENTS 1 /* I don’t know how to thread right now. */ #define MAX_CLIENT_MSG_LEN 1000 int main() { WSADATA wsa; SOCKET mySocket, acceptSocket; struct sockaddr_in server, client; int sockAddrInLength = sizeof(struct sockaddr_in); char clientMessage[MAX_CLIENT_MSG_LEN]; int clientMessageLength; char* message; int running […]

比较从C中的套接字接收的字符串数据

我有关于套接字的问题。 我有这个代码: while(bytes = recv(sClient, cClientMessage, 599, 0)){ 这会将它收到的消息放入cClientMessage中,并且消息始终为“Message”。 我如何制作if语句,如if(cClientMessage == “Message”){//do func} 。 现在这段代码不会执行我想要的function。 我认为这是因为它没有收到正确的信息。 有人能帮我吗?

如何在读取完成之前远程服务器关闭套接字时如何处理C中的套接字读取?

读取调用上的客户端块等待读取n个字节。 服务器写入n个字节并立即关闭连接。 如果在读取完成之前套接字关闭或由于某些其他问题,在这种情况下可以读取调用返回负数或零吗? (在这种情况下,客户端/服务器在同一个Linux机器上运行) 我正面临这样的情况,但不确定这在TCP / IP子系统中如何工作以及如何解决它。 Sever: write close Client: read close

退出阻塞的recv()调用

我想退出阻塞的recv()调用。 基于这个问题 ,我应该做到以下几点: shutdown(s, SD_RECEIVE); 但它不起作用, recv()仍在阻塞! 编辑: 这是我使用的代码: #include #include #include #include #pragma comment(lib, “ws2_32.lib”) unsigned int __stdcall recvThread(void *p) { SOCKET s = *((SOCKET*)p); char buffer[2048]; int size; do { size = recv(s, buffer, 2048, 0); if (size > 0) { printf(“Some data received\n”); } else if (size == 0) { printf(“Disconnected\n”); } […]

通信ac服务器和java客户端时出错

我正在尝试在C中创建一个带有multithreading支持的tcp echo服务器和用java编写的客户端,两者都使用套接字进行通信。 通信开始很好,但不知何故,在服务器和客户端之间传递的字符串经过几次尝试(添加新的行字符或发送的旧消息片段)后开始“损坏”。 我搜索了论坛,并认为问题是C的空字符,但在java中删除它没有任何区别。 这是C服务器的代码: #include #include #include #include #include /* See NOTES */ #include #include #include #include #include #include #include #include #include struct message { int operacion; int dato; }; int max_attempts; int obtenerMaxAttempts() { FILE *fp; fp = fopen(“server.conf”, “r”); if (fp == NULL) { perror(“Error abriendo fichero”); printf(“Errno:%d”, errno); } char line[LINE_MAX]; […]

动态更改源IP地址

我有一个服务器有几个不同的IP地址。 此时,每个IP都可以接收UDP请求,但它始终与回复的IP相同,请求者不喜欢。 总而言之,这是所有基本代码: int sock; socklen_t clilen; struct sockaddr_in serv_addr, cli_addr; memset((char*)&serv_addr, 0, sizeof(serv_addr)); sock = socket(AF_INET, SOCK_DGRAM, 0); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(PORT); … recvfrom(sock, buffer, BUFLEN, 0, (struct sockaddr *)&cli_addr, &clilen); … sendto(sock, resData, resLen, 0, (struct sockaddr *)&cli_addr, sizeof(cli_addr)); 我希望能够以某种方式指定哪个IP用于发送回我的数据包(这可能因每个请求而有所不同),但我不知道如何使用套接字实现这一点。 我在这个领域并不是那么有经验,所以我能得到的所有帮助都非常感激。 编辑如下 我已经在接受的答案中找到了一个潜在的解决方案: 如何在Linux中重新绑定udp套接字 但是,出现了一个新问题。 我如何知道哪个IP /接口收到了请求? 这样我就可以使用该IP […]

上传和POST文件到PHP页面

我需要一种方法来上传文件并将其发布到php页面 php在apache服务器上 我在我的桌面应用程序中使用此c代码: 它是c代码的套接字 当我执行程序时,可以得到 文件大小是772906 open server ok文件大小是772906连接到服务器ok打开文件ok fread 102400 bytes,发送102400字节fread 102400字节,发送102400字节fread 102400字节,发送102400字节fread 102400字节,发送102400字节fread 102400发送102400字节fread 102400字节,发送102400字节fread 102400字节,发送102400字节fread 56106字节,发送56106字节发送文件完成! 结果:返回代码: 上传: 类型: 大小:0 Kb 临时文件: 存储在: 但文件不存在。 我想也许它可能是HTTP协议,但我不知道该怎么做。 你能告诉我细节吗? 非常感谢。 #include #include #include #include #include #include #include #include #include #include #include #include int main(){ int sockfd, numbytes; FILE *fp; char buf[300]; char filename[10]=”1.jpg”; char send1[100]; […]

IPv6套接字程序问题

似乎流不会进入ipv6server.c中包含accept的“for”循环,因此无法接受并连接客户端。 是什么错误? 此代码适用于IPV4,但在IPV6更改后出现此问题 ipv6server.c #include #include /* needed for os x */ #include /* for memset */ #include #include #include /* defines ERESTART, EINTR */ #include /* defines WNOHANG, for wait() */ #include “port.h” /* defines default port */ #ifndef ERESTART #define ERESTART EINTR #endif extern int errno; void serve(int port); /* main server function […]

使用CygWin进行C套接字编程

嗨,我正在尝试使用CygWin在C中编写一个servlets器/客户端程序,问题是,Cygwin中的gcc编译器似乎不包含与套接字编程相关的标准头文件。 在尝试编译我的服务器程序时,我得到: netinet/in.h: No such file or directory sys/socket.h: No such file or directory netdb.h: No such file or directory 这三个标题是否位于CygWin-enviorment的其他位置?

用Scapy与Csockets通信

我有一个UDP连接并侦听端口(localhost),我也试图从localhost发送一个Scapy数据包。 出于某种原因,我的C代码实际上从未捕获过数据包,但是我可以看到数据包在Wireshark中显示就好了。 自从我使用套接字以来已经有一段时间了,但我是否需要设置一些特殊的套接字选项,或者为什么我能够在Wireshark中看到数据包就好但不是通过C套接字? 注意:当我编写相应的套接字代码来发送数据包(来自localhost)时,我能够成功捕获数据包但是当从另一台计算机发送时,我仍然无法获取侦听数据包来捕获数据包。 我发现了一个类似的问题但是当我尝试他们的方法(使用UDP而不是TCP)时,我仍然无法使用netcat来捕获Scapy数据包。 C代码(为了清楚起见而浓缩) int main() { int sock, dataLen, inLen; struct sockaddr_in inAddr; short listen_port = 8080; char buffer[2048]; if (sock = socket(AF_INET,SOCK_DGRAM,0) < 0) { printf("ERROR: unable to establish socket\n"); return -1; } // zero out address structure memset(&inAddr, 0, sizeof(inAddr)); inAddr.sin_family = AF_INET; inAddr.sin_addr.s_addr = htonl(INADDR_ANY); inAddr.sin_port = htons(listen_port); if […]