声明:文章中内容部分参考网络资料。
============================TCP and UDP service=============================
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#define DEFAULT_PORT 8080
#define MAXLINE 4096
#define BACKLOG 10
#define BUF_SIZE 200
int main(int argc, char** argv)
{
int socket_fd, new_fd;
struct sockaddr_in servaddr;
struct sockaddr_in client_addr;
char buf[4096];
int i;
int err,sock_reuse=1;
int fd_A[BACKLOG] = {0};
fd_set fdsr;
int maxsock;
struct timeval tv;
int conn_amount = 0;
socklen_t sin_size;
if(argc < 2)
{
printf("input param is too few \n");
return -1;
}
if((strstr(argv[1],"TCP")==NULL)&&(strstr(argv[1],"UDP")==NULL))
{
printf("the type is error\n");
return -1;
}
//TCP operator
if(!strcmp(argv[1],"TCP"))
{
//init Socket
if( (socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
{
perror("create socket error:");
return -1;
}
err=setsockopt(socket_fd,SOL_SOCKET,SO_REUSEADDR,(char *)&sock_reuse,sizeof(sock_reuse));
if(err!=0)
{
perror("set setsocketopt error:");
return -1;
}
//init service addr
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//IPµØÖ•ÉèÖóÉINADDR_ANY,ÈÃϵͳ×Ô¶¯»ñÈ¡±¾»úµÄIPµØÖ•¡£
servaddr.sin_port = htons(DEFAULT_PORT);//ÉèÖõĶ˿ÚΪDEFAULT_PORT
//bind service addr in socket
if( bind(socket_fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
{
perror("bind socket error:");
return -1;
}
//listen client
if( listen(socket_fd, BACKLOG) == -1)
{
printf("listen socket error: ");
return -1;
}
printf("======waiting for client's request======\n");
sin_size = sizeof(client_addr);
maxsock = socket_fd;
while(1)
{
FD_ZERO(&fdsr);
FD_SET(socket_fd, &fdsr);
// timeout setting
tv.tv_sec = 30;
tv.tv_usec = 0;
// add active connection to fd set
for (i = 0; i < BACKLOG; i++)
{
if (fd_A[i] != 0)
{
FD_SET(fd_A[i], &fdsr);
}
}
err = select(maxsock + 1, &fdsr, NULL, NULL,NULL);
if (err < 0)
{
perror("select");
break;
}
else if (err == 0)
{
printf("timeout\n");
continue;
}
// check every fd in the set
for (i = 0; i < conn_amount; i++)
{
if (FD_ISSET(fd_A[i], &fdsr))
{
err = recv(fd_A[i], buf, sizeof(buf), 0);
char str[] = "Good,very nice!\n";
send(fd_A[i],str,sizeof(str) + 1, 0);
if (err <= 0)
{ // client close
printf("client[%d] close\n", i);
close(fd_A[i]);
FD_CLR(fd_A[i], &fdsr);
fd_A[i] = 0;
}
else
{ // receive data
if (err < BUF_SIZE)
memset(&buf[err], '\0', 1);
printf("client[%d] send:%s\n", i, buf);
}
}
}
// check whether a new connection comes
if (FD_ISSET(socket_fd, &fdsr))
{
new_fd = accept(socket_fd, (struct sockaddr *)&client_addr, &sin_size);
if (new_fd <= 0)
{
perror("accept");
continue;
}
// add to fd queue
if (conn_amount < BACKLOG)
{
fd_A[conn_amount++] = new_fd;
printf("new connection client[%d] %s:%d\n", conn_amount,\
inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
if (new_fd > maxsock)
maxsock = new_fd;
}
else
{
printf("max connections arrive, exit\n");
send(new_fd, "bye", 4, 0);
close(new_fd);
break;
}
}
}
// close other connections
for (i = 0; i < BACKLOG; i++)
{
if (fd_A[i] != 0)
{
close(fd_A[i]);
}
}
}
else
{
printf("---------UDP service \n");
if( (socket_fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1 )
{
perror("create socket error:");
return -1;
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//IPµØÖ•ÉèÖóÉINADDR_ANY,ÈÃϵͳ×Ô¶¯»ñÈ¡±¾»úµÄIPµØÖ•¡£
servaddr.sin_port = htons(DEFAULT_PORT);//ÉèÖõĶ˿ÚΪDEFAULT_PORT
//bind service addr in socket
if( bind(socket_fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
{
perror("bind socket error:");
return -1;
}
sin_size = sizeof(client_addr);
while(1)
{
/* waiting for receive data */
err = recvfrom(socket_fd, buf, sizeof(buf), 0, (struct sockaddr *)&client_addr, &sin_size);
printf("msg from %s \n",inet_ntoa(servaddr.sin_addr));
printf("recv is %s \n",buf);
/* sent data back to client */
sendto(socket_fd, "ok nice", sizeof("ok nice"), 0, (struct sockaddr *)&client_addr, sin_size);
}
}
return 0;
}
=======================TCP and UDP client============================
/* File Name: client.c */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#define MAXLINE 4096
int main(int argc, char** argv)
{
int sockfd, n,rec_len;
char recvline[4096], sendline[4096];
char buf[MAXLINE];
struct sockaddr_in servaddr;
if(argc < 3)
{
printf("input param is too few \n");
return -1;
}
if((strstr(argv[1],"TCP")==NULL)&&(strstr(argv[1],"UDP")==NULL))
{
printf("the type is error\n");
return -1;
}
if(!strcmp(argv[1],"TCP"))
{
if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);
exit(0);
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(8080);
if( inet_pton(AF_INET, argv[2], &servaddr.sin_addr) <= 0)
{
printf("inet_pton error for %s\n",argv[2]);
exit(0);
}
if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
{
printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
exit(0);
}
printf("send msg to server: \n");
fgets(sendline, 4096, stdin);
if( send(sockfd, sendline, strlen(sendline), 0) < 0)
{
printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
exit(0);
}
if((rec_len = recv(sockfd, buf, MAXLINE,0)) == -1)
{
perror("recv error");
exit(1);
}
buf[rec_len] = '\0';
printf("Received : %s ",buf);
close(sockfd);
exit(0);
}
else
{
if( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);
exit(0);
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(8080);
if( inet_pton(AF_INET, argv[2], &servaddr.sin_addr) <= 0)
{
printf("inet_pton error for %s\n",argv[2]);
exit(0);
}
if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
{
printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
exit(0);
}
printf("send msg to server: \n");
fgets(sendline, 4096, stdin);
if( send(sockfd, sendline, strlen(sendline), 0) < 0)
{
printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
exit(0);
}
if((rec_len = recv(sockfd, buf, MAXLINE,0)) == -1)
{
perror("recv error");
exit(1);
}
buf[rec_len] = '\0';
printf("Received : %s ",buf);
close(sockfd);
exit(0);
}
}