- 论坛徽章:
- 0
|
项目测试的需要,写了一个 Linux 系统的的 UDP 服务端和客户端小程序,方便起见,客户端和服务器端写在了一个文件里,默认启动客户端,但如果加上 -s 参数就按服务器启动。
/************udpapplet.h***************/
#ifndef _UDP_SERVER__
#define _UDP_SERVER__
#include stdlib.h>
#include stdio.h>
#include unistd.h>
#include errno.h>
#include sys/socket.h>
#include netinet/in.h>
#define DEFAULT_SERVER_IP "127.0.0.1"
#define DEFAULT_SERVER_PORT 4321
#define MAX_BUFSIZE 2048
typedef struct
{
int socket_fd;
struct sockaddr_in to_addr;
int to_addr_len;
char snd_buf[MAX_BUFSIZE];
struct sockaddr_in from_addr;
int from_addr_len;
char rcv_buf[MAX_BUFSIZE];
char serverIp[32];
int serverPort;
int isServer;
} UDP_Info_t;
#endif
/************udpapplet.c***************/
#include "udpapplet.h"
UDP_Info_t udpInfo;
int startUDPServer(UDP_Info_t * pInfo);
int startUDPClient(UDP_Info_t * pInfo);
int main(int argc, char **argv)
{
sprintf(udpInfo.serverIp, "%s", DEFAULT_SERVER_IP);
udpInfo.serverPort = DEFAULT_SERVER_PORT;
if (argc > 1)
{
int opt;
while (-1 != (opt = getopt(argc, argv, "a:p:s")))
{
switch (opt)
{
case 'a':
sprintf(udpInfo.serverIp, "%s", optarg);
break;
case 'p':
udpInfo.serverPort = atoi(optarg);
break;
case 's':
udpInfo.isServer = 1;
break;
default:
fprintf(stderr, "There's some error in your parameters.\n");
}
}
}
if (udpInfo.isServer)
{
startUDPServer(&udpInfo);
}
else
{
startUDPClient(&udpInfo);
}
return 0;
}
int startUDPServer(UDP_Info_t * pInfo)
{
int err;
fd_set rd_set;
struct timeval timeout;
pInfo->socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
if (pInfo->socket_fd 0)
{
perror("socket error");
return -1;
}
pInfo->from_addr_len = sizeof(pInfo->from_addr);
bzero(&pInfo->from_addr, pInfo->from_addr_len);
pInfo->from_addr.sin_family = AF_INET;
pInfo->from_addr.sin_addr.s_addr = htonl(INADDR_ANY);
pInfo->from_addr.sin_port = htons(pInfo->serverPort);
err = bind(pInfo->socket_fd, (struct sockaddr *)&pInfo->from_addr, pInfo->from_addr_len);
if (err 0)
{
perror("bind error");
return -1;
}
while (1)
{
memset(&timeout, 0, sizeof(struct timeval));
timeout.tv_usec = 10000;
do {
FD_ZERO(&rd_set);
FD_SET(pInfo->socket_fd, &rd_set);
err = select ((pInfo->socket_fd + 1), &rd_set, NULL, NULL, &timeout);
if (err 0)
{
perror("select error");
return -1;
}
else if (err == 0)
{
break;
}
err = recvfrom(pInfo->socket_fd, pInfo->rcv_buf, MAX_BUFSIZE, 0, &pInfo->from_addr, &pInfo->from_addr_len);
if (err 0)
{
perror("recv error");
return -1;
}
else
{
fprintf(stderr, "recv data : %s\n", pInfo->rcv_buf);
}
} while (timeout.tv_usec > 0);
}
return 0;
}
int startUDPClient(UDP_Info_t * pInfo)
{
int err;
pInfo->to_addr_len = sizeof(struct sockaddr_in);
memset(&pInfo->to_addr, 0, pInfo->to_addr_len);
pInfo->to_addr.sin_family = AF_INET;
pInfo->to_addr.sin_addr.s_addr = inet_addr(pInfo->serverIp);
pInfo->to_addr.sin_port = htons(pInfo->serverPort);
pInfo->socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
if (pInfo->socket_fd 0)
{
perror("socket error");
return -1;
}
while (1)
{
memset(pInfo->snd_buf, 0, sizeof(pInfo->snd_buf));
read(STDIN_FILENO, pInfo->snd_buf, sizeof(pInfo->snd_buf));
err = sendto(pInfo->socket_fd, pInfo->snd_buf, sizeof (pInfo->snd_buf), 0, &pInfo->to_addr, pInfo->to_addr_len);
if (err 0)
{
perror("send error");
return -1;
}
else
{
fprintf(stderr, "send a msg to %s:%d\n", pInfo->serverIp, pInfo->serverPort);
}
}
return 0;
}
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/73948/showart_1108357.html |
|