嘉兴网站建设999 999,中国建设招标网是私人网站吗,wordpress博客速度很慢,外贸网站建设lanscendC语言实现windows环境下Socket编程TCP/IP协议 主要是记录解决一些在我本地编译运行时出现的问题connect #xff1a;No error关于头文件关于stray /xxx和socket#xff1a;No error问题千万记得是服务器先启动哦#xff0c;客户端后启动下面附上我改好的代码 主要是记录解决… C语言实现windows环境下Socket编程TCP/IP协议 主要是记录解决一些在我本地编译运行时出现的问题connect No error关于头文件关于stray /xxx和socketNo error问题千万记得是服务器先启动哦客户端后启动下面附上我改好的代码 主要是记录解决一些在我本地编译运行时出现的问题
代码是别人的问题是我的。顺便记录一下遇见的各种问题和我的解决办法。
connect No error
可能的解决方案 1、服务端和客户端不在一个局域网可以开热点这样就在了。然后ipconfig查看IP地址就ok了。至于怎么查看在不在就ping一下对方就好了。 2、一个局域网下也ping不通看看自己和对方的防火墙有没有关有些时候不关就ping不通。
关于头文件
1、#include sys/types.h、#include sys/socket.h、#include netinet/in.h、#include arpa/inet.h 这几个东西总是找不到后面百度说是因为这是在linux系统下的库在windows就不行在windows里面用下面的头文件替代
#include winsock2.h
#pragma comment(lib,“ws2_32.lib”)
#include Ws2tcpip.h关于stray /xxx和socketNo error问题
搜集到的问题解释是因为没有初始化socket。 在建立套接字前加以下代码即可
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2,2),wsaData)!0){perror(WSADATA失败);
}小tip如果直接复制进你的代码还出现报错貌似是格式问题可以尝试手敲上述代码可解决。
千万记得是服务器先启动哦客户端后启动
下面附上我改好的代码
参考博客C语言实现TCP通信 我改的代码 服务端.
#include sys/stat.h#include fcntl.h#include errno.h#include winsock2.h
#pragma comment(lib,“ws2_32.lib”)#include sys/types.h#include Ws2tcpip.h#include stdio.h#include string.h#include stdlib.h#include unistd.h#define SERVER_PORT 6666/*
监听后一直处于accept阻塞状态
直到有客户端连接
当客户端如数quit后断开与客户端的连接
*/int main(){//调用socket函数返回的文件描述符int serverSocket;//声明两个套接字sockaddr_in结构体变量分别表示客户端和服务器struct sockaddr_in server_addr;struct sockaddr_in clientAddr;int addr_len sizeof(clientAddr);int client;char buffer[200];int iDataNum;//socket函数失败返回-1//int socket(int domain, int type, int protocol);//第一个参数表示使用的地址类型一般都是ipv4AF_INET//第二个参数表示套接字类型tcp面向连接的稳定数据传输SOCK_STREAM//第三个参数设置为0WSADATA wsaData;if(WSAStartup(MAKEWORD(2,2),wsaData)!0){perror(WSADATA失败);}if((serverSocket socket(AF_INET, SOCK_STREAM, 0)) 0){perror(socket);return 1;}bzero(server_addr, sizeof(server_addr));//初始化服务器端的套接字并用htons和htonl将端口和地址转成网络字节序server_addr.sin_family AF_INET;server_addr.sin_port htons(SERVER_PORT);//ip可是是本服务器的ip也可以用宏INADDR_ANY代替代表0.0.0.0表明所有地址server_addr.sin_addr.s_addr htonl(INADDR_ANY);//对于bindaccept之类的函数里面套接字参数都是需要强制转换成(struct sockaddr *)//bind三个参数服务器端的套接字的文件描述符if(bind(serverSocket, (struct sockaddr *)server_addr, sizeof(server_addr)) 0){perror(connect);return 1;}//设置服务器上的socket为监听状态if(listen(serverSocket, 5) 0){perror(listen);return 1;}while(1){printf(监听端口: %d\n, SERVER_PORT);//调用accept函数后会进入阻塞状态//accept返回一个套接字的文件描述符这样服务器端便有两个套接字的文件描述符//serverSocket和client。//serverSocket仍然继续在监听状态client则负责接收和发送数据//clientAddr是一个传出参数accept返回时传出客户端的地址和端口号//addr_len是一个传入-传出参数传入的是调用者提供的缓冲区的clientAddr的长度以避免缓冲区溢出。//传出的是客户端地址结构体的实际长度。//出错返回-1client accept(serverSocket, (struct sockaddr*)clientAddr, (socklen_t*)addr_len);if(client 0){perror(accept);continue;}printf(等待消息...\n);//inet_ntoa ip地址转换函数将网络字节序IP转换为点分十进制IP//表达式char *inet_ntoa (struct in_addr);printf(IP is %s\n, inet_ntoa(clientAddr.sin_addr));printf(Port is %d\n, htons(clientAddr.sin_port));while(1){printf(读取消息:);buffer[0] \0;iDataNum recv(client, buffer, 1024, 0);if(iDataNum 0){perror(recv null);continue;}buffer[iDataNum] \0;if(strcmp(buffer, quit) 0)break;printf(%s\n, buffer);printf(发送消息:);scanf(%s, buffer);printf(\n);send(client, buffer, strlen(buffer), 0);if(strcmp(buffer, quit) 0)break;}}close(serverSocket);return 0;
}
我改的代码 客户端.
#include sys/stat.h#include fcntl.h#include errno.h#include winsock2.h
#pragma comment(lib,“ws2_32.lib”)#include sys/types.h#include Ws2tcpip.h#include stdio.h#include string.h#include stdlib.h#include unistd.h#define SERVER_PORT 6666/*
连接到服务器后会不停循环等待输入
输入quit后断开与服务器的连接
*/int main(){//客户端只需要一个套接字文件描述符用于和服务器通信WSADATA wsaData;if(WSAStartup(MAKEWORD(2,2),wsaData)!0){perror(WSADATA失败);}int clientSocket;//描述服务器的socketstruct sockaddr_in serverAddr;char sendbuf[200];char recvbuf[200];int iDataNum;if((clientSocket socket(AF_INET, SOCK_STREAM, 0)) 0){perror(socket);return 1;}serverAddr.sin_family AF_INET;serverAddr.sin_port htons(SERVER_PORT);//指定服务器端的ip本地测试127.0.0.1//inet_addr()函数将点分十进制IP转换成网络字节序IPserverAddr.sin_addr.s_addr inet_addr(服务端IP地址);if(connect(clientSocket, (struct sockaddr *)serverAddr, sizeof(serverAddr)) 0){perror(connect);return 1;}printf(连接到主机...\n);while(1){printf(发送消息:);scanf(%s, sendbuf);printf(\n);send(clientSocket, sendbuf, strlen(sendbuf), 0);if(strcmp(sendbuf, quit) 0)break;printf(读取消息:);recvbuf[0] \0;iDataNum recv(clientSocket, recvbuf, 200, 0);recvbuf[iDataNum] \0;printf(%s\n, recvbuf);}close(clientSocket);return 0;}