今天开始学习在VC++上socket编程,先把代码贴上,备忘一下······
注意:因为本程序使用了WinSock库的函数,按照动态链接库的使用方法之一,这时还需要为程序链接相应的.lib文件。本程序是在VC++6.0下开发的,这里要为本程序链接相应的库文件:ws2_32.lib。方法是选择【project\Seting...】菜单项,并在弹出的Project Setting对话框上选择Link选项卡,然后在Object/library modules编辑框中添加ws2_32.lib文件。输入的库文件与前面的库文件之间一定要有空格。
1.TCP服务端代码:
#include <winsock2.h>
#include <stdio.h>
void main()
{
//加载套接字库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
return;
}
if (LOBYTE(wsaData.wVersion) != 1 ||
HIBYTE(wsaData.wVersion) != 1) {
WSACleanup();
return;
}
//创建用于监听的套接字
SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
//绑定套接字
bind(sockSrv, (SOCKADDR *)&addrSrv, sizeof(SOCKADDR));
//将套接字设为监听模式,准备接收客户请求
listen(sockSrv, 5);
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
while (1)
{
//等待客户端请求到来
SOCKET sockConn = accept(sockSrv, (SOCKADDR *)&addrClient, &len);
char sendBuf[100];
sprintf(sendBuf, "Welcome %s to http://www.sunxin.org",
inet_ntoa(addrClient.sin_addr));
//发送数据
send(sockConn, sendBuf, strlen(sendBuf) + 1, 0);
char recvBuf[100];
//接受数据
recv(sockConn, recvBuf, 100, 0);
//打印接收的数据
printf("%s\n", recvBuf);
//关闭套接字
closesocket(sockConn);
}
}
2.TCP客户端代码:
#include <winsock2.h>
#include <stdio.h>
void main()
{
//加载套接字库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
return;
}
if (LOBYTE(wsaData.wVersion) != 1 ||
HIBYTE(wsaData.wVersion) != 1) {
WSACleanup();
return;
}
//创建套接字
SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
//向服务器发出连接请求
connect(sockClient, (SOCKADDR *)&addrSrv, sizeof(SOCKADDR));
//接收数据
char recvBuf[100];
recv(sockClient, recvBuf, 100, 0);
printf("%s\n", recvBuf);
//发送数据
send(sockClient, "This is lisi", strlen("This is lisi")+1, 0);
//关闭套接字
closesocket(sockClient);
WSACleanup();
}
3.UDP服务端代码:
#i nclude "Winsock2.h"
#i nclude "stdio.h"
void main()
{
//初始化socket库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return;
}
SOCKET sockSrv = socket( AF_INET , SOCK_DGRAM , 0 ) ;
SOCKADDR_IN addrSrv ;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY) ;
addrSrv.sin_family = AF_INET ;
addrSrv.sin_port = htons(4000) ;
bind( sockSrv , (SOCKADDR*)&addrSrv , sizeof(SOCKADDR) ) ;
char sendBuf[100] ;
char recvBuf[100] ;
char tempBuf[200] ;
SOCKADDR_IN addrClient ;
int len = sizeof(SOCKADDR) ;
while (1)
{
recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len) ;
if ( 'q' == recvBuf[0] )
{
sendto(sockSrv,"q",strlen("q")+1,0,(SOCKADDR*)&addrClient,len) ;
printf("chat end!\n") ;
break ;
}
sprintf(tempBuf,"%s say : %s",inet_ntoa(addrClient.sin_addr),recvBuf) ;
printf( "%s\n" , tempBuf ) ;
printf( "Please input data:\n" ) ;
gets( sendBuf ) ;
sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrClient,len) ;
}
closesocket( sockSrv ) ;
WSACleanup() ;
}
#i nclude "stdio.h"
void main()
{
//初始化socket库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return;
}
SOCKET sockSrv = socket( AF_INET , SOCK_DGRAM , 0 ) ;
SOCKADDR_IN addrSrv ;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY) ;
addrSrv.sin_family = AF_INET ;
addrSrv.sin_port = htons(4000) ;
bind( sockSrv , (SOCKADDR*)&addrSrv , sizeof(SOCKADDR) ) ;
char sendBuf[100] ;
char recvBuf[100] ;
char tempBuf[200] ;
SOCKADDR_IN addrClient ;
int len = sizeof(SOCKADDR) ;
while (1)
{
recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len) ;
if ( 'q' == recvBuf[0] )
{
sendto(sockSrv,"q",strlen("q")+1,0,(SOCKADDR*)&addrClient,len) ;
printf("chat end!\n") ;
break ;
}
sprintf(tempBuf,"%s say : %s",inet_ntoa(addrClient.sin_addr),recvBuf) ;
printf( "%s\n" , tempBuf ) ;
printf( "Please input data:\n" ) ;
gets( sendBuf ) ;
sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrClient,len) ;
}
closesocket( sockSrv ) ;
WSACleanup() ;
}
4.UDP客户端代码:
#i nclude "Winsock2.h"
#i nclude "stdio.h"
void main()
{
//³õʼ»¯socket¿â
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return;
}
SOCKET sockClient = socket( AF_INET , SOCK_DGRAM , 0 ) ;
SOCKADDR_IN addrSrv ;
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1") ;
addrSrv.sin_family = AF_INET ;
addrSrv.sin_port = htons(4000) ;
char sendBuf[100] ;
char recvBuf[100] ;
char tempBuf[200] ;
int len = sizeof(SOCKADDR) ;
while (1)
{
printf("Please input data:\n");
gets( sendBuf ) ;
sendto( sockClient , sendBuf , strlen(sendBuf) , 0 ,
(SOCKADDR*)&addrSrv , len ) ;
recvfrom( sockClient , recvBuf , 100 , 0 , (SOCKADDR*)&addrSrv , &len ) ;
if ( 'q' == recvBuf[0] )
{
sendto(sockClient , "q" , strlen("q")+1 , 0 , (SOCKADDR*)&addrSrv , len) ;
printf("chat end!") ;
break ;
}
sprintf( tempBuf , "%s say: %s\n" , inet_ntoa(addrSrv.sin_addr) , recvBuf ) ;
printf( tempBuf ) ;
}
closesocket(sockClient) ;
WSACleanup() ;
}
#i nclude "stdio.h"
void main()
{
//³õʼ»¯socket¿â
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return;
}
SOCKET sockClient = socket( AF_INET , SOCK_DGRAM , 0 ) ;
SOCKADDR_IN addrSrv ;
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1") ;
addrSrv.sin_family = AF_INET ;
addrSrv.sin_port = htons(4000) ;
char sendBuf[100] ;
char recvBuf[100] ;
char tempBuf[200] ;
int len = sizeof(SOCKADDR) ;
while (1)
{
printf("Please input data:\n");
gets( sendBuf ) ;
sendto( sockClient , sendBuf , strlen(sendBuf) , 0 ,
(SOCKADDR*)&addrSrv , len ) ;
recvfrom( sockClient , recvBuf , 100 , 0 , (SOCKADDR*)&addrSrv , &len ) ;
if ( 'q' == recvBuf[0] )
{
sendto(sockClient , "q" , strlen("q")+1 , 0 , (SOCKADDR*)&addrSrv , len) ;
printf("chat end!") ;
break ;
}
sprintf( tempBuf , "%s say: %s\n" , inet_ntoa(addrSrv.sin_addr) , recvBuf ) ;
printf( tempBuf ) ;
}
closesocket(sockClient) ;
WSACleanup() ;
}