udp 简单server和client

 server.cpp

#include <sys/types.h>
#include <sys/socket.h>
#include <pthread.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>


/*
 UDP Server网络编程的基本步骤
   创建socket, 指定udp协议
   将socket与地址和端口绑定
   使用 recvfrom/sendto 接收/发送数据
   使用close关闭连接
*/


int main(int argc, char * *argv)
{
  struct sockaddr_in addr;
  addr.sin_family     = AF_INET;
  addr.sin_port       = htons(9876);
  addr.sin_addr.s_addr = htonl(INADDR_ANY);

  char buff_recv[512] = {0};
  char buff_send[512] = "world";

  struct sockaddr_in clientAddr;
  int n;
  int len = sizeof(clientAddr);

  int sock;   

  printf("Welcome! This is a UDP server.\n");

  if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
  {
      printf("socket error.\n");
      exit(1);
  }

  if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0)
  {
    printf("bind error.\n");
    exit(1);
  }

  while (1)
  {
    n = recvfrom(sock, buff_recv, 511, 0, (struct sockaddr *) &clientAddr,(socklen_t*) &len);
    if (n > 0)
    {
      buff_recv[n] = 0;
      printf("recv data from client:%s %u says: %s\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port), buff_recv);

      n = sendto(sock, buff_send, n, 0, (struct sockaddr *) &clientAddr, sizeof(clientAddr));
      if (n < 0)
      {

        printf("sendto error.\n");
        break;

      }else {
        printf("send data len %d \n",n);
      }
    }
  }
   return 0;
}

//g++  udp_server.c -o  userver

client.cpp

#include <sys/types.h>
#include <sys/socket.h>
#include <pthread.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>


int main(int argc, char * *argv)
{   
    struct sockaddr_in addr;
    int sock;

    addr.sin_family     = AF_INET;
    addr.sin_port       = htons(9876);
    addr.sin_addr.s_addr = inet_addr("192.168.0.126"); //127.0.0.1

    char buff_send[512] = "Hello";
    char buff_recv[512] = {0};
    int len = sizeof(addr);

    int n = 0;

    printf("This is a UDP client\n");

    if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    {
      printf("socket error.\n");
      exit(1);
    }

    if (addr.sin_addr.s_addr == INADDR_NONE)
    {
      printf("Incorrect ip address!");
      close(sock);
      exit(1);
    }

    n = sendto(sock, buff_send, strlen(buff_send), 0, (struct sockaddr *) &addr, sizeof(addr));
    if (n < 0)
    {
      printf("sendto error.\n");
      close(sock);
    }
     

    n = recvfrom(sock, buff_recv, 512, 0, (struct sockaddr *) &addr,(socklen_t*)&len);
    if (n > 0)
    {
        buff_recv[n] = 0;
        printf("received from sever:");
        puts(buff_recv);
    }
    else if (n == 0)
        printf("server closed.\n");
    else if (n == -1)
        printf("recvfrom error.\n");

    pause();
    close(sock);
    
    return 0;
}

//g++  udp_client.c -o  uclient

 

window平台

udpclient:

#include <stdio.h>
#include <winsock2.h>

#pragma comment(lib,"ws2_32.lib")
#define	BUF_SIZE	1024
#define PORT_		9411

int main(void)
{
	WSADATA wsd;
	int iRet = 0;

	// 初始化套接字动态库
	if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0) {
		iRet = WSAGetLastError();
		printf("WSAStartup failed !\n");
		return -1;
	}

	char strSend[BUF_SIZE] = "test udp send", strRecv[BUF_SIZE] = { 0 };
	SOCKADDR_IN servAddr;
	SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);

	// 设置服务器地址
	servAddr.sin_family = AF_INET;
	//servAddr.sin_addr.S_un.S_addr = inet_addr("192.168.0.104");
	servAddr.sin_addr.S_un.S_addr = inet_addr("192.168.1.106");
	servAddr.sin_port = htons(PORT_);

	// 向服务器发送数据
	int nServAddLen = sizeof(servAddr);
	iRet = sendto(sockClient, strSend, BUF_SIZE, 0, (sockaddr*)&servAddr, nServAddLen);
	if (iRet == SOCKET_ERROR) {
		printf("sendto() failed:%d\n", WSAGetLastError());
		closesocket(sockClient);
		WSACleanup();
		return -1;
	}

	iRet = recvfrom(sockClient, strRecv, BUF_SIZE, 0, (sockaddr*)&servAddr, &nServAddLen);
	if (SOCKET_ERROR == iRet)
	{
		printf("recvfrom failed:%d\n", WSAGetLastError());
		closesocket(sockClient);
		WSACleanup();
		return -1;
	}

	printf("Recv From Server:%s\n", strRecv);
	closesocket(sockClient);
	WSACleanup();

	return 0;
}

udpserver

#include <stdio.h>
#include <winsock2.h>

#pragma comment(lib,"ws2_32.lib")
#define	BUF_SIZE	1024
#define PORT_		9411

int main(void)
{
	WSADATA wsd;
	int iRet = 0;

	// 初始化套接字动态库
	if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0) {
		printf("WSAStartup failed:%d!\n", WSAGetLastError());
		return -1;
	}

	SOCKET socketSrv = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
	SOCKADDR_IN addrSrv;
	SOCKADDR_IN addrClient;
	char strRecv[BUF_SIZE] = { 0 }, strSend[BUF_SIZE] = "udp server send";
	int len = sizeof(SOCKADDR);

	// 设置服务器地址
	ZeroMemory(strRecv, BUF_SIZE);
	//addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	addrSrv.sin_addr.S_un.S_addr = inet_addr("192.168.1.106"); 
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(PORT_);

	// 绑定套接字
	iRet = bind(socketSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
	if (SOCKET_ERROR == iRet)
	{
		printf("bind failed%d!\n", WSAGetLastError());
		closesocket(socketSrv);
		WSACleanup();
	}

	// 从客户端接收数据
	printf("udp server start...\n");
	while (TRUE)
	{
		iRet = recvfrom(socketSrv, strRecv, BUF_SIZE, 0, (SOCKADDR*)&addrClient, &len);
		if (SOCKET_ERROR == iRet) {
			printf("recvfrom failed !\n");
			closesocket(socketSrv);
			WSACleanup();
			return -1;
		}

		printf("Recv From Client:%s\n", strRecv);

		// 向客户端发送数据
		sendto(socketSrv, strSend, sizeof(strSend), 0, (SOCKADDR*)&addrClient, len);
	}

	closesocket(socketSrv);
	WSACleanup();

	return 0;
}

 

在windows下 ,注意socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);  第三个参数要是IPPROTO_IP ,不然recvfrom 会一直返回 -1

 

 

#include <iostream>
#include <winsock2.h>
#include<string.h>
#include<sstream>
#include <stdlib.h>
#include <thread>

#pragma comment(lib,"ws2_32.lib")

int main() {

	WSADATA wsadata;
	WSAStartup(MAKEWORD(2, 2), &wsadata);

	SOCKET Client;
	Client = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); //IPPROTO_UDP


	SOCKADDR_IN sockAddrIn;
	memset(&sockAddrIn, 0, sizeof(sockAddrIn));
	sockAddrIn.sin_family = AF_INET;
	sockAddrIn.sin_port = htons(9876 );
	sockAddrIn.sin_addr.s_addr = inet_addr("192.168.0.126"); // 182.254.212.98 223.104.212.61 56039   92.168.0.126

	 

	//设置socket的选项
	//int time_out = 2000;
	//if (setsockopt(Client, SOL_SOCKET, SO_RCVTIMEO, (char*)&time_out, sizeof(time_out)) != 0) {
	//	return -1;
	//}

	bool isconn=false;
	while (true) {
		char buf[200]="i am client";
		char buff_recv[512] = { 0 };
		int len= sizeof(sockAddrIn);
		scanf("%s", buf);
		int recvRet;
		int sendRet;
		if (!isconn)
		{

	
			 sendRet = sendto(Client, buf, strlen(buf)+1, 0, (sockaddr*)&sockAddrIn, sizeof(sockAddrIn));
			if (sendRet == -1) {
				std::cout << WSAGetLastError() << std::endl;
				std::cout << "send failed" << std::endl;
				break;
			}
			else {
				std::cout << "send success" << std::endl;
			}
			  recvRet = recvfrom(Client, buff_recv, 511, 0, (sockaddr*)&sockAddrIn, &len);
			std::cout << recvRet << std::endl;
			std::cout << "serverdata:" << buff_recv << std::endl;

			char *strtemp=strstr(buff_recv, ":");
			if (strtemp != NULL)
			{
				//std::cout << strtemp << std::endl;
			   int mid=	strlen(buff_recv) - strlen(strtemp);
			   buff_recv[mid] = 0;

				std::cout << buff_recv << std::endl;
				sockAddrIn.sin_port = htons(atoi(strtemp + 1));
				sockAddrIn.sin_addr.s_addr = inet_addr(buff_recv);
				 
				std::cout << "port:" << atoi(strtemp+1)<<"\n ip:"<< buff_recv << std::endl;

				sendto(Client, buf, strlen(buf) + 1, 0, (sockaddr*)&sockAddrIn, sizeof(sockAddrIn));  //p2p 连接

				isconn = true;
			}
		}
		std::this_thread::sleep_for ( std::chrono::seconds(1));
		//开始通信
		sendto(Client, buf, strlen(buf) + 1, 0, (sockaddr*)&sockAddrIn, sizeof(sockAddrIn));



		recvRet = recvfrom(Client, buff_recv, 511, 0, (sockaddr*)&sockAddrIn, &len);
		std::cout << recvRet << std::endl;

		if (recvRet == -1) {
			continue;
		}
		else {
			std::cout <<"serverdata:"<< buff_recv << std::endl;
		}

	}
	return 0;
}

 

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
UDP Server: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define BUF_SIZE 1024 #define PORT 8888 int main() { int sockfd; struct sockaddr_in server_addr, client_addr; socklen_t client_len; char buf[BUF_SIZE]; bzero(&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(PORT); sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { perror("socket"); exit(EXIT_FAILURE); } if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("bind"); exit(EXIT_FAILURE); } while (1) { memset(buf, 0, BUF_SIZE); client_len = sizeof(client_addr); if (recvfrom(sockfd, buf, BUF_SIZE, 0, (struct sockaddr *)&client_addr, &client_len) < 0) { perror("recvfrom"); continue; } printf("Received message from %s:%d: %s\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), buf); } close(sockfd); return 0; } ``` UDP Client: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define BUF_SIZE 1024 #define SERVER_IP "127.0.0.1" #define PORT 8888 int main() { int sockfd; struct sockaddr_in server_addr; char buf[BUF_SIZE]; bzero(&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = inet_addr(SERVER_IP); server_addr.sin_port = htons(PORT); sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { perror("socket"); exit(EXIT_FAILURE); } while (1) { printf("Enter message: "); fgets(buf, BUF_SIZE, stdin); if (sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { perror("sendto"); continue; } printf("Sent message to server: %s\n", buf); } close(sockfd); return 0; } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值