UDP Server和Client源碼實例

server

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

#define	UDP_TEST_PORT		50001

int main(int argC, char* arg[])
{
	struct sockaddr_in addr;
	int sockfd, len = 0;	
	int addr_len = sizeof(struct sockaddr_in);
	char buffer[256];	

	/* 建立socket,注意必須是SOCK_DGRAM */
	if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
		perror ("socket");
		exit(1);
	}

	/* 填寫sockaddr_in 結構 */
	bzero(&addr, sizeof(addr));
	addr.sin_family = AF_INET;
	addr.sin_port = htons(UDP_TEST_PORT);
	addr.sin_addr.s_addr = htonl(INADDR_ANY) ;// 接收任意IP發來的數據

	/* 綁定socket */
	if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr))<0) {
		perror("connect");
		exit(1);
	}

	while(1) {
		bzero(buffer, sizeof(buffer));
		len = recvfrom(sockfd, buffer, sizeof(buffer), 0, 
					   (struct sockaddr *)&addr ,&addr_len);
		/* 顯示client端的網絡地址和收到的字符串消息 */
		printf("Received a string from client %s, string is: %s\n", 
				inet_ntoa(addr.sin_addr), buffer);
		/* 將收到的字符串消息返回給client端 */
		sendto(sockfd,buffer, len, 0, (struct sockaddr *)&addr, addr_len);
	}

	return 0;
}

// ----------------------------------------------------------------------------
// End of udp_server.c

client.c

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

#define	UDP_TEST_PORT		50001
#define UDP_SERVER_IP 		"127.0.0.1"

int main(int argC, char* arg[])
{
	struct sockaddr_in addr;
	int sockfd, len = 0;	
	int addr_len = sizeof(struct sockaddr_in);		
	char buffer[256];

	/* 建立socket,注意必須是SOCK_DGRAM */
	if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
		perror("socket");
		exit(1);
	}

	/* 填寫sockaddr_in*/
	bzero(&addr, sizeof(addr));
	addr.sin_family = AF_INET;
	addr.sin_port = htons(UDP_TEST_PORT);
	addr.sin_addr.s_addr = inet_addr(UDP_SERVER_IP);

	while(1) {
		bzero(buffer, sizeof(buffer));

		printf("Please enter a string to send to server: \n");

		/* 從標準輸入設備取得字符串*/
		len = read(STDIN_FILENO, buffer, sizeof(buffer));

		/* 將字符串傳送給server端*/
		sendto(sockfd, buffer, len, 0, (struct sockaddr *)&addr, addr_len);

		/* 接收server端返回的字符串*/
		len = recvfrom(sockfd, buffer, sizeof(buffer), 0, 
				       (struct sockaddr *)&addr, &addr_len);
		printf("Receive from server: %s\n", buffer);
	}

	return 0;
}

// ----------------------------------------------------------------------------
// End of udp_client.c

client2.c

 connect函數用於無連接的網絡服務。傳送的報文目的地址會設置成connect調用中所指的地址,這樣每次傳送報文時就不需要再提供地址。另外只能接收來自指定地址的報文。

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
 
#define	UDP_TEST_PORT		50001
#define UDP_SERVER_IP 		"127.0.0.1"
 
int main(int argC, char* arg[])
{
	struct sockaddr_in addr;
	int sockfd, len = 0;	
	int addr_len = sizeof(struct sockaddr_in);		
	char buffer[256];
char buffer2[256];
	int result=0;
 
	/* 建立socket,注意必須是SOCK_DGRAM */
	if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
		perror("socket");
		exit(1);
	}
 
	/* 填寫sockaddr_in*/
	bzero(&addr, sizeof(addr));
	addr.sin_family = AF_INET;
	addr.sin_port = htons(UDP_TEST_PORT);
	addr.sin_addr.s_addr = inet_addr(UDP_SERVER_IP);


/*  Now connect our socket to the server's socket.  */

    result = connect(sockfd, (struct sockaddr *)&addr, addr_len);

    if(result == -1) {
        perror("oops: client3");
        exit(1);
    }
 
	while(1) {
		bzero(buffer, sizeof(buffer));
 
		printf("Please enter a string to send to server: \n");
 
		/* 從標準輸入設備取得字符串*/
		len = read(STDIN_FILENO, buffer, sizeof(buffer));
		write(sockfd, buffer, len);
        len = read(sockfd, buffer2, sizeof(buffer2));

		printf("Receive from server: %s\n", buffer2);
	}
 
	return 0;
}
 
// ----------------------------------------------------------------------------
// End of udp_client.c

具有超時返回的client 

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h> 
 
#define	UDP_TEST_PORT		50001
#define UDP_SERVER_IP 		"127.0.0.1"
#define TIMEOUT		10

void
sigalrm(int signo)
{
}
 
int main(int argC, char* arg[])
{
	struct sockaddr_in addr;
	int sockfd, len = 0;	
	int addr_len = sizeof(struct sockaddr_in);		
	char buffer[256];
	struct sigaction	sa;

	
	sa.sa_handler = sigalrm;
	sa.sa_flags = 0;
	sigemptyset(&sa.sa_mask);
	if (sigaction(SIGALRM, &sa, NULL) < 0)
		printf("sigaction error");
 
	/* 建立socket,注意必須是SOCK_DGRAM */
	if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
		perror("socket");
		exit(1);
	}
 
	/* 填寫sockaddr_in*/
	bzero(&addr, sizeof(addr));
	addr.sin_family = AF_INET;
	addr.sin_port = htons(UDP_TEST_PORT);
	addr.sin_addr.s_addr = inet_addr(UDP_SERVER_IP);
 
	while(1) 
	{
		bzero(buffer, sizeof(buffer));
 
		printf("Please enter a string to send to server: \n");
 
		/* 從標準輸入設備取得字符串*/
		len = read(STDIN_FILENO, buffer, sizeof(buffer));
 
		/* 將字符串傳送給server端*/
		sendto(sockfd, buffer, len, 0, (struct sockaddr *)&addr, addr_len);
 
		alarm(TIMEOUT);
		/* 接收server端返回的字符串*/

		if ((len = recvfrom(sockfd, buffer, sizeof(buffer), 0, NULL, NULL)) < 0) 
		{
			if (errno != EINTR)
				alarm(0);

			printf("recv error");
			exit(0);
		}
		alarm(0);
		printf("Receive from server: %s\n", buffer);
	}
 
	return 0;
}
 
// ----------------------------------------------------------------------------
// End of udp_client.c

轉自:http://velep.com/archives/934.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章