网络编程的设计与实现

  • 格式:doc
  • 大小:42.50 KB
  • 文档页数:5

实验五、 网络编程的设计与实现
一.实验目的:
通过该实验掌握最基本的Client/Server(客户机/服务器)模式的网络编程技术,并
在此基础上实现更为复杂的网络编程。

二.任务要求:
1、按所附的参考程序使用VC++或其他工具设计出程序()
2、在第1步的基础上使用VC++或其他工具设计出一个能实现两个人聊天的网
络程序

三.实验环境:
Windows 平台,VC++
四.实验内容:
#include
#include
#include
#define MAXSIZE 100
#pragma comment(lib, "ws2_32.lib")
void main() {

char sendbuf[MAXSIZE],s[MAXSIZE];
char recvbuf[MAXSIZE];

sockaddr_in service;
SOCKET AcceptSocket;
SOCKET server;
WSADATA wsaData;
int bytesSend,bytesRecv;

// 初始化
int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
if ( iResult != NO_ERROR )
printf("Error at WSAStartup()\n");

// 建立socket
server = socket(AF_INET,SOCK_STREAM, IPPROTO_TCP );

if ( server == INVALID_SOCKET ) {
printf( "Error at socket(): %ld\n", WSAGetLastError() );
WSACleanup();
return;
}

// 绑定socket
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr("127.0.0.1");
service.sin_port = htons( 27016 );

if ( bind( server, (SOCKADDR*) &service, sizeof(service) ) ==
SOCKET_ERROR ) {
printf( "bind() failed.\n" );
closesocket(server);
return;
}

// 监听 socket
if ( listen( server, 1 ) == SOCKET_ERROR )
printf( "Error listening on socket.\n");

// 接受连接

printf( "Waiting for a client to connect...\n" );
AcceptSocket = SOCKET_ERROR;
while ( AcceptSocket == SOCKET_ERROR ) {
AcceptSocket = accept( server, NULL, NULL );
}

printf( "Client Connected.\n");
server = AcceptSocket;

strcpy(recvbuf,"");
bytesRecv=recv(server,recvbuf, MAXSIZE, 0 );
if (bytesRecv==0 || bytesRecv==WSAECONNRESET ) {
printf( "Connection Closed.\n");
return;
}

strcpy(sendbuf, "欢迎访问服务器!!");
if (bytesSend=send(server, sendbuf, strlen(sendbuf),0)==SOCKET_ERROR)
{
printf("发送数据出错");
return;
}
while(1)
{
memset(recvbuf,'\0',sizeof(recvbuf));
printf("服务器:");
gets(s);
if (bytesSend=send(server, s, strlen(s),0)==SOCKET_ERROR)
{
printf("发送数据出错");
return;
}
if (recv(server,recvbuf,sizeof(recvbuf),0)==SOCKET_ERROR)
{
printf("接收数据出错");
return;
}
int i=0;
printf("客户:");
puts(recvbuf);
}
closesocket(server);
WSACleanup();

}
再编一个client 程序:
#include
#include
#include
#define MAXSIZE 100
#pragma comment(lib, "ws2_32.lib")
void main() {

// 初始化 Winsock.
WSADATA wsaData;
char sendbuf[MAXSIZE],s[MAXSIZE];
char recvbuf[MAXSIZE];
SOCKET client;
sockaddr_in clientService;
int bytesSend,bytesRecv;

int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
if ( iResult != NO_ERROR )
printf("Error at WSAStartup()\n");

// 建立socket socket.
client = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if ( client == INVALID_SOCKET ) {
printf( "Error at socket(): %ld\n", WSAGetLastError() );
WSACleanup();
return;
}

printf("socket 创建成功!\n");
// 连接到服务器.

clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr("127.0.0.1");
clientService.sin_port = htons( 27016 );

if ( connect( client, (SOCKADDR*) &clientService, sizeof(clientService) ) ==
SOCKET_ERROR) {
printf( "连接失败。\n" );
WSACleanup();
return;
}

printf( "连接成功\n" );

// 开始发送和接受数据.
strcpy(sendbuf,"来自客户端的消息!!\n");
memset(recvbuf,'\0',sizeof(recvbuf));
bytesSend=send(client, sendbuf, strlen(sendbuf),0);
if (bytesSend==SOCKET_ERROR)
{
printf("发送数据出错");
return;
}
printf("创建发送+%ld+字节的数据.\n",bytesSend);
if (recv(client,recvbuf,MAXSIZE,0)==SOCKET_ERROR)
{
printf("接收数据出错");
return;
}

printf("%s \n",recvbuf);
while(1)
{
memset(recvbuf,'\0',sizeof(recvbuf));
if (recv(client,recvbuf,sizeof(recvbuf),0)==SOCKET_ERROR)
{
printf("接收数据出错");
return;
}
printf("服务器:");
int i=0;
puts(recvbuf);
printf("客户:");
gets(s);
if (bytesSend=send(client, s, strlen(s),0)==SOCKET_ERROR)
{
printf("发送数据出错");
return;
}

}
closesocket(client);
WSACleanup();
}