之前我一直在学习c#,相比c/c++来说,vs环境提供了更多的方便。
但是从今天开始我决定学习网络编程使用的语言不是c#,而是C/c++,虽然我不排斥c#和asp.net,因为他们具有更好的语法和开发效率,并且容易学习。
网络程序分为client 和server.windows封装了底层的网络操作,提供了一个通用的socket接口
常用函数WSAStartup(),socket(),closesocket(),WSACleanup(),connect().
常用数据结构sockaddr_in,和较早版本的sockaddr.
头文件:Wincock2.h
库文件:ws2_32.lib(使用这样的语法包含#pragma comment(lib,"ws2_32.lib ")
下边贴上最基本的代码
server端 :
程序逻辑,建立监听5000端口,然后等待客户端连接,发送"hello"字符串,然后关闭连接,重新等待新连接
- #include <Winsock2.h>
- #include <stdio.h>
- #include <stdlib.h>
- #pragma comment(lib,"ws2_32.lib ")
- #define PORT 5000
- void main()
- {
- int port = PORT;
- WSADATA wsadata;
- SOCKET sListen,sAccept;
- int iLen;
- int iSend;
- char buf[] = "hello";
- struct sockaddr_in serv,client;
- if(WSAStartup(MAKEWORD(2,2),&wsadata)!=0)
- {
- printf("Winsock load failed/n");
- return;
- }
- sListen = socket(AF_INET,SOCK_STREAM,0);
- if(sListen ==INVALID_SOCKET)
- {
- printf("socket failed:%d/n",WSAGetLastError());
- return;
- }
- serv.sin_family = AF_INET;
- serv.sin_port = htons(port);
- serv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
- if(bind(sListen,(struct sockaddr*)&serv,sizeof(serv))==SOCKET_ERROR)
- {
- printf("bind() failed:%d/n",WSAGetLastError());
- return;
- }
- if(listen(sListen,5)==SOCKET_ERROR)
- {
- printf("listen failed:%d/n",WSAGetLastError());
- return;
- }
- iLen = sizeof(client);
- while(1)
- {
- sAccept = accept(sListen,(struct sockaddr*)&client,&iLen);
- if(sAccept == INVALID_SOCKET)
- {
- printf("accept()error:%d/n",WSAGetLastError());
- return;
- }
- printf("accept client information:/n/tip:[%s],/n/tport:[%d]/n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));
- iSend = send(sAccept,buf,sizeof(buf),0);
- if(iSend == SOCKET_ERROR)
- {
- printf("send() failed:%d/n",WSAGetLastError());
- return;
- }
- else if(iSend==0)
- break;
- else
- printf("send() byte:%d/n",iSend);
- closesocket(sAccept);
- }
- closesocket(sListen);
- WSACleanup();
- }
client端
程序逻辑:主动连接192.168.0.100的5000端口,注意使用网络字节序和本地字节序的转换htons(),htonl(),ntohs(),ntohl().
- #include <Winsock2.h>
- #include <stdio.h>
- #include <stdlib.h>
- #pragma comment(lib,"ws2_32.lib ")
- #define PORT 5000
- #define BUFFER 1024
- # define serveraddr 127.0.0.1
- void main(int argc,char *argv)
- {
- WSADATA wsadata;
- SOCKET client;
- int port = PORT;
- int iLen;
- char buf[BUFFER];
- struct sockaddr_in serv;
- memset(buf,0,sizeof(buf));
- if(WSAStartup(MAKEWORD(2,2),&wsadata)!=0)
- {
- printf("Winsock load failed/n");
- return;
- }
- serv.sin_family = AF_INET;
- serv.sin_port = htons(port);
- serv.sin_addr.S_un.S_addr = inet_addr("192.168.0.100");
- client = socket(AF_INET,SOCK_STREAM,0);
- if(client == INVALID_SOCKET)
- {
- printf("socket()failed:%d",WSAGetLastError());
- return;
- }
- if(connect(client,(struct sockaddr*)&serv,sizeof(serv))==INVALID_SOCKET)
- {
- printf("connect() failed:%d/n",WSAGetLastError());
- return;
- }
- else
- {
- iLen = recv(client,buf,sizeof(buf),0);
- if(iLen ==0)
- return;
- else if(iLen ==SOCKET_ERROR)
- {
- printf("revc() failed:%d/n",WSAGetLastError());
- return;
- }
- else
- {
- }
- printf("recv() data from server:%s/n",buf);
- }
- closesocket(client);
- WSACleanup();
- printf("/nok!");
- while(1);
- }