TCP
服务器端程序:
1. 创建套接字(socket)。
2. 将套接字绑定到本地地址(网络层协议IP)和端口(网络端口)上(bing)。
3. 将套接字设为监听模式,装备接受客服区请求(listen)。
4. 等待客户请求到达:当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)。
5. 用返回的套接字与客服端进行通信(send/recv)。
6. 返回,等待另一个客户请求。
7. 关闭套接字。
#include <winsock2.h>
#include <stdio.h>
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return -1;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return -1;
}
SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN adr_in;
adr_in.sin_family = AF_INET;
adr_in.sin_port = htons(6000);
adr_in.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
bind(sockSrv, (SOCKADDR*)&adr_in, sizeof(adr_in));
listen(sockSrv,5);
SOCKADDR_IN adr_cli;
int len = sizeof(SOCKADDR);
while (1)
{
SOCKET sock = accept(sockSrv, (SOCKADDR *)&adr_cli, &len);
char buf[100];
sprintf(buf, "welcome %s to http://www.sunxin.arg",
inet_ntoa(adr_cli.sin_addr));
send(sock, buf, strlen(buf)+1, 0);
char rbuf[100];
recv(sock, rbuf, 100, 0);
printf("%s\n", rbuf);
closesocket(sock);
}
return 0;
}
客服端程序:
1. 创建套接字(socket)。
2. 向服务器发送连接请求(connect)。
3. 和服务器进行通信(send/recv);
4. 关闭套接字。
#include <winsock2.h>
#include <stdio.h>
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return -1;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return -1;
}
SOCKET Client = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addr_client;
addr_client.sin_family = AF_INET;
addr_client.sin_port = htons(6000);
addr_client.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
if (0 == connect(Client, (SOCKADDR *)&addr_client, sizeof(SOCKADDR_IN)))
{
char rebuf[100];
recv(Client, rebuf, 100, 0);
printf("%s\n", rebuf, 100, 0);
send(Client, "this is zhang san", strlen("this is zhang san")+1,0);
}
closesocket(Client);
WSACleanup();
return 0;
}
UDP:
服务器端程序:
1. 创建套接字(socket)。
2. 将套接字绑定到本地地址(网络层协议IP)和端口(网络端口)上(bing)。
3. 等待接受数据(recvfrom)
4. 关闭套接字。
#include <winsock2.h>
#include <stdio.h>
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return -1;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return -1;
}
SOCKET Srevie = socket(AF_INET, SOCK_DGRAM, 0);
SOCKADDR_IN addr_srv;
addr_srv.sin_family = AF_INET;
addr_srv.sin_port = htons(6001);
addr_srv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
bind(Srevie, (SOCKADDR*)&addr_srv, sizeof(addr_srv));
while (1)
{
char buf[100];
SOCKADDR_IN addr_cli;
int len = sizeof(SOCKADDR_IN);
recvfrom(Srevie, buf, 100, 0, (SOCKADDR*)&addr_cli, &len);
printf("%s\n", buf);
}
closesocket(Srevie);
WSACleanup();
return 0;
}
客服端程序:
1. 创建套接字(socket)。
2.向服务发送数据(sendto)。
3. 关闭套接字。
#include <winsock2.h>
#include <stdio.h>
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return -1;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return -1;
}
SOCKET Client = socket(AF_INET, SOCK_DGRAM, 0);
SOCKADDR_IN addr_srv;
addr_srv.sin_family = AF_INET;
addr_srv.sin_port = htons(6001);
addr_srv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
sendto(Client, "wo shi zhang si", strlen("wo shi zhang si")+1,
0, (SOCKADDR *)&addr_srv, sizeof(SOCKADDR));
closesocket(Client);
WSACleanup();
return 0;
}