您的位置:首页 > 理论基础 > 计算机网络

第一个windows网络程序

2010-08-22 17:28 441 查看
之前我一直在学习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"字符串,然后关闭连接,重新等待新连接

Code:

#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().

Code:

#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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: