欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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;
}