写Socket的时候必须导入:
#include <Winsock2.h>
必须link ws2_32.lib;
Server(服务端)程序:
#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 socketSrv = socket(AF_INET, SOCK_STREAM, 0);
//把套接字绑定到本地地址和端口上.
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
//指定地址族
addrSrv.sin_family = AF_INET;
//指定端口,网络程序指定端口的时候.要用1024已上.
//如果用htons把一个int或long转成一个网络字节序就会丢失数据.
addrSrv.sin_port = htons(6000);
//绑定到一个本地地址和端口上.
bind(socketSrv, (SOCKADDR *)&addrSrv, sizeof(SOCKADDR));
//设置套接字为监听模式和等待连接队列的最大值.
listen(socketSrv, 5);
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
while(1){
//当客户端的信息到来时,返回来相对于这个连接的套接字.
SOCKET sockConn = accept(socketSrv, (SOCKADDR *)&addrClient, &len);
//向客户端发送的数据.
char sendBuf[100];
//格式化一个Buffer,inet_ntoa()可以把一个in_addr类型的转化为一个点分10进制格式的数字.
sprintf(sendBuf, "IP: %s", 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); //关闭套接字.
}
//终止对套接字库的使用.
WSACleanup();
}
Client(客户端程序):
#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 socketClient = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addrSrv;
//设置地址,用inet_addr()函数来把一个字符串转换为一个点分十进制格式.
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
//建立链接.
connect(socketClient,(SOCKADDR *)&addrSrv, sizeof(SOCKADDR));
//发送的信息.
char sendBuf[100];
//获取键盘上输入的信息
gets(sendBuf);
send(socketClient, sendBuf, strlen(sendBuf)+1, 0);
char recvBuf[100];
recv(socketClient, recvBuf, sizeof(recvBuf), 0);
printf("%s \n", recvBuf);
//关闭套接字,释放为套接字分配的资源.
closesocket(socketClient);
//终止对套接字库的
WSACleanup();
}