TCP/UDP下的socket编程
程序员文章站
2022-07-14 10:04:07
...
TCP:
server端步骤:
1.创建一个socket,用socket()函数。
2.绑定IP地址,端口信息到socket上,用bind()函数。
3.开启监听,用listen()函数。
4.接收客户端来的连接,用accept()函数。
5.收发数据,用send()和revc()函数。
6.关闭网络连接。
#include<stdio.h>
#include<stdlib.h>
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#define PORT 5000
int main()
{
WSADATA wsadata;
if(WSAStartup(MAKEWORD(2,2),&wsadata)!=0)
{
printf("Failed to load Winsock");
return 0;
}
char s[]="Sever:hello client,I am a server.";
SOCKET server=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(server==SOCKET_ERROR)
{
printf("creat socket error\n");
return 0;
}
sockaddr_in addr;
addr.sin_family=AF_INET;
addr.sin_port=htons(5000);
/*把16位的数字从主机字节顺序转换成网络字节顺序*/
addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
/*把32位的数字从主机字节顺序转换成网络字节顺序*/
if(bind(server,(sockaddr*)&addr,sizeof(addr))==SOCKET_ERROR)
{
printf("bind error!\n");
return 0;
}
if(listen(server,10)==SOCKET_ERROR)
{
printf("listen error\n");
return 0;
}
SOCKET conn;
sockaddr_in clientAddr;
int len=sizeof(SOCKADDR);
while(1)
{
printf("wait connect....\n");
conn = accept(server, (SOCKADDR*) &clientAddr, &len);
if(conn== SOCKET_ERROR)
{
printf("accept error!\n");
break;
}
printf("accept connect IP:%s\n",inet_ntoa(clientAddr.sin_addr));
char buf[500];
recv(conn,buf,sizeof(buf),0);
printf("%s\n",buf);
int ret=send(conn,s,sizeof(s),0);
if(ret==SOCKET_ERROR)
{
printf("send error\n");
break;
}
closesocket(conn);
}
closesocket(server);
WSACleanup();
return 0;
}
client端:
1.创建一个socket,用socket()函数。
2.设置要连接的对方的IP地址和端口。
3.连接服务器,用connect()函数。
4.收发数据,用send()和revc()函数。
5.关闭网络连接。
#include <iostream>
using namespace std;
#include<stdio.h>
#include<stdlib.h>
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib")
int main()
{
WSADATA wsadata;
if(WSAStartup(MAKEWORD(2,2),&wsadata)!=0)
{
printf("Failed to load Winsock");
return 0;
}
SOCKADDR_IN addr;
addr.sin_family=AF_INET;
addr.sin_port=htons(5000);
addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
SOCKET client=socket(AF_INET,SOCK_STREAM,0);
if(connect(client,(sockaddr*)&addr,sizeof(addr))==INVALID_SOCKET)
{
printf("connect error\n");
return 0;
}
char s1[]="client:hello,I am a Client....";
int flag=send(client,s1,sizeof(s1),0);
if(flag==SOCKET_ERROR)
{
printf("send error\n");
return 0;
}
char buf[500];
recv(client,buf,sizeof(buf),0);
printf("%s\n", buf);
closesocket(client);
WSACleanup();
return 0;
}
UDP:server端步骤:
1.创建一个socket,用socket()函数。
2.绑定IP地址,端口信息到socket上,用bind()函数。
3.循环接收数据,用recvfrom()函数。
4.关闭网络连接。
#include <stdio.h>
#include <winsock2.h>
#include <Windows.h>
#pragma comment(lib,"ws2_32.lib")
#define PORT 6000
int main( )
{
//初始化网络环境
WSADATA wsa;
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
{
printf("WSAStartup failed\n");
return 0;
}
//建立一个UDP的socket
SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sock == SOCKET_ERROR)
{
printf("create socket failed\n");
return 0;
}
//绑定地址信息
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(PORT);
serverAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
bind(sock, (sockaddr*)&serverAddr, sizeof(sockaddr));
char buf[512];
while (1)
{ printf("wait connect.....\n");
memset(buf, 0, 512);
// 网络节点的信息,用来保存客户端的网络信息
sockaddr_in clientAddr;
memset(&clientAddr, 0, sizeof(sockaddr_in));
int clientAddrLen = sizeof(sockaddr);
//接收客户端发来的数据
int ret = recvfrom(sock, buf, 512, 0,(sockaddr*) &clientAddr,&clientAddrLen );
printf("Recv msg:%s from IP:[%s] Port:[%d]\n", buf,inet_ntoa(clientAddr.sin_addr),ntohs(clientAddr.sin_port));
// 发一个数据包返回给客户
sendto(sock, "hello client,I am server.", strlen("hello client,I am server."), 0, (sockaddr*)&clientAddr, clientAddrLen);
}
return 0;
}
client端:
1. 创建一个socket,用socket()函数。
2.设置要连接的对方的IP地址和端口。
3.发送数据,用sendto()函数。
4.关闭网络连接。
#include <stdio.h>
#include <winsock2.h>
#include <Windows.h>
#pragma comment(lib,"ws2_32.lib")
#define PORT 6000
int main(int argc, char* argv[])
{
//初始化网络环境
WSADATA wsa;
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
{
printf("WSAStartup failed\n");
return -1;
}
//建立一个UDP的socket
SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sockClient == INVALID_SOCKET)
{
printf("create socket failed\n");
return -1;
}
// 申明一个网络地址信息的结构体,保存服务器的地址信息
sockaddr_in addr = { 0 };
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
char buf[] = "hello,I am client.\n";
//发送数据
int dwSent = sendto(sockClient, buf, strlen(buf), 0, (SOCKADDR *)&addr, sizeof(SOCKADDR));
if (dwSent == 0)
{
printf("send failed\n");
return 0;
}
char recvBuf[512];
memset(recvBuf, 0, 512);
sockaddr_in addrSever;
int nServerAddrLen=sizeof(sockaddr_in);
// 接收数据
int dwRecv = recvfrom(sockClient, recvBuf, 512, 0, (SOCKADDR *)&addrSever,&nServerAddrLen);
printf("%s\n", recvBuf);
//关闭SOCKET连接
closesocket(sockClient);
//清理网络环境
WSACleanup();
return 0;
}
上一篇: java设计模式之单例模式
下一篇: Java设计模式之单例模式