最近开始学习自习网络编程了,按照的是课本<<TCP/IP网络编程>>,这本书 很适合学完c++之后学生,真是一本很好的书
看完前几章后我写完了第一个服务端和客户端
但是传输的数据结果不对,看了好久也没找出来
//server.cpp
#include"iostream" //1.连接头文件winsock2.h和动态链接库ws2_32.lib #include "winsock2.h" #pragma comment(lib,"ws2_32.lib") //end_1 using namespace std; void ErrorHanding(char* message); int main(int argc,char* argv[]){ WSADATA wsa_data; SOCKET server_socket,client_socket; SOCKADDR_IN server_addr,client_addr; int size_client_addr; char message[]="hello world"; if(argc!=2){ cout<<"Usage: "<<argv[0]<<" <port>"<<endl; exit(1); } //2对winsocket的初始化,int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData); //wVersionRequested是版本信息,lpWSAData是一个指向WSAData型的指针,WSAData作用不清楚 if(WSAStartup(MAKEWORD(2,2),&wsa_data)!=0){//WSAStartup调用成功返回0 ErrorHanding("WSAStartup() error!"); exit(1); } //end_2 //3创建套接字 server_socket=socket(PF_INET,SOCK_STREAM,0); if(server_socket==INVALID_SOCKET){ ErrorHanding("socket() error!"); exit(1); } //end_3 //4服务端地址的初始化 memset(&server_addr,0,sizeof(server_addr));//server_addr赋值为0 server_addr.sin_family=AF_INET; server_addr.sin_addr.s_addr=htonl(INADDR_ANY);//本机地址,是一个10进制 server_addr.sin_port=htons(atoi(argv[1]));//atoi将字符串转化成整形,转化成10进制 //end_4 //5bind() if(bind(server_socket,(SOCKADDR*) &server_addr,sizeof(server_addr))==SOCKET_ERROR){//(SOCKADDR*)不止对应是ip4,也可以对应ip6 //所以SOCKADDR_IN(ip4)和SOCKADDR对应内存模型一致 ErrorHanding("bind() error!"); exit(1); } //end_5 //6listen() if(listen(server_socket,5)==SOCKET_ERROR){ ErrorHanding("listen() error!"); exit(1); } //end_6 //7accept()拿到client信息 size_client_addr=sizeof(client_addr); cout<<"begin:"<<size_client_addr<<endl; client_socket=accept(server_socket,(SOCKADDR*) &client_socket,&size_client_addr);//???&size_client_addr为什么要的是这个地址 //accept调用后将client地址大小放在&size_client_addr里,accept对ip4和ip6都有效 cout<<"begin:"<<size_client_addr<<endl; if(client_socket==INVALID_SOCKET){ ErrorHanding("accept() error!"); exit(1); } //end_7 //8send() send(client_socket,message,sizeof(message),0);//int send( SOCKET s, const char FAR *buf, int len, int flags ); 第4个参数一般是0 //end_8 closesocket(server_socket); closesocket(client_socket); WSACleanup();//对winsock的注销 return 0; } void ErrorHanding(char* message){ fputs(message,stderr); fputc('\n',stderr); }
//client.cpp
#include"iostream" #include "winsock2.h" #pragma comment(lib,"ws2_32.lib") #include "string" using namespace std; void ErrorHanding(char* message); int main(int argc,char* argv[]){ WSADATA wsa_data; SOCKET client_socket; SOCKADDR_IN server_addr; char message[30]; if(argc!=3){ cout<<"Usage: "<<argv[0]<<" <IP> <port>"<<endl; exit(1); } if(WSAStartup(MAKEWORD(2,2),&wsa_data)!=0){ ErrorHanding("WSAStartup() error!"); exit(1); } client_socket=socket(PF_INET,SOCK_STREAM,0); if(client_socket==INVALID_SOCKET){ ErrorHanding("socket() error!"); exit(1); } memset(&server_addr,0,sizeof(server_addr)); server_addr.sin_family=AF_INET; //server_addr.sin_addr.s_addr=htonl(INADDR_ANY);//服务端 server_addr.sin_addr.s_addr=inet_addr(argv[1]);//和server端相比,这里传递的是字符串,用inet_addr()转化 server_addr.sin_port=htons(atoi(argv[2])); if(connect(client_socket,(SOCKADDR*) &server_addr,sizeof(server_addr))==SOCKET_ERROR){ ErrorHanding("socket() error!"); exit(1); } int strlen=recv(client_socket,message,sizeof(message)-1,0); if(strlen==-1){ ErrorHanding("recv() error!"); exit(1); } cout<<message<<endl; closesocket(client_socket); WSACleanup(); return 0; } void ErrorHanding(char* message){ fputs(message,stderr); fputc('\n',stderr); }
//server.cpp
//client.cpp
传到client的数据不是hello world!