c语言UDP TCP通信实例(linux)
UDP 通信server ---------------------------------------------------------------- #include <stdio.h> /* These are the usual header files */ #include <string.h> #include <unistd.h> /* for close() */ #include <sys/types.h> #include <sys/socket.h> #include <stdlib.h> #include <netinet/in.h> #include <arpa/inet.h> #define PORT 1234 /* Port that will be opened */ #define MAXDATASIZE 100 /* Max number of bytes of data */ main() { int sockfd; /* socket descriptors */ struct sockaddr_in server; /* server's address information */ struct sockaddr_in client; /* client's address information */ socklen_t sin_size; int num; char recvmsg[MAXDATASIZE]; /* buffer for message */ char sendmsg[MAXDATASIZE]; char condition[] = "quit"; /* Creating UDP socket */ if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { /* handle exception */ perror("Creating socket failed."); exit(1); } bzero(&server,sizeof(server)); server.sin_family=AF_INET; server.sin_port=htons(PORT); server.sin_addr.s_addr = htonl (INADDR_ANY); if (bind(sockfd, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1) { /* handle exception */ perror("Bind error."); exit(1); } sin_size=sizeof(struct sockaddr_in); while (1) { num = recvfrom(sockfd,recvmsg,MAXDATASIZE,0,(struct sockaddr *)&client,&sin_size); if (num < 0){ perror("recvfrom error\n"); exit(1); } recvmsg[num] = '\0'; printf("You got a message (%s) from %s\n",recvmsg,inet_ntoa(client.sin_addr) ); /* prints client's IP */ if(strcmp(recvmsg,condition)==0) break; int i=0; for(i = 0 ; i < num ; i ++) { sendmsg[i] = recvmsg[num-1-i]; } sendmsg[num]='\0'; sendto(sockfd,sendmsg,strlen(sendmsg),0,(struct sockaddr *)&client,sin_size); } close(sockfd); /* close listenfd */ } --------------------------------------------------------- client #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <strings.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> /* netbd.h is needed for struct hostent =) */ #define PORT 1234 /* Open Port on Remote Host */ #define MAXDATASIZE 100 /* Max number of bytes of data */ int main(int argc, char *argv[]) { int fd, numbytes; /* files descriptors */ char recvbuf[MAXDATASIZE]; /* buf will store received text */ char sendbuf[MAXDATASIZE]; struct hostent *he; /* structure that will get information about remote host */ struct sockaddr_in server,client; /* server's address information */ if (argc !=2) { /* this is used because our program will need two argument (IP address and a message */ printf("Usage: %s <IP Address> \n",argv[0]); exit(1); } if ((he=gethostbyname(argv[1]))==NULL){ /* calls gethostbyname() */ printf("gethostbyname() error\n"); exit(1); } if ((fd=socket(AF_INET, SOCK_DGRAM, 0))==-1){ /* calls socket() */ printf("socket() error\n"); exit(1); } bzero(&server,sizeof(server)); server.sin_family = AF_INET; server.sin_port = htons(PORT); /* htons() is needed again */ server.sin_addr = *((struct in_addr *)he->h_addr); /*he->h_addr passes "*he"'s info to "h_addr" */ socklen_t len; len=sizeof(struct sockaddr_in); while (1) { printf("input message:"); fgets(sendbuf,40,stdin); sendto(fd,sendbuf,strlen(sendbuf),0,(struct sockaddr *)&server,len); if ((numbytes=recvfrom(fd,recvbuf,MAXDATASIZE,0,(struct sockaddr *)&server,&len)) == -1){ /* calls recvfrom() */ printf("recvfrom() error\n"); exit(1); } recvbuf[numbytes]='\0'; printf("Server Return Reverse Message: %s\n",recvbuf); /* it prints server's welcome message */ } close(fd); /* close fd */ }
声明以上内容转自blog :http://blog.chinaunix.net/uid-25885064-id-3066651.html
TCP通信例子如下
/***clent*************************************************/ #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/select.h> #include <arpa/inet.h> #include <netinet/in.h> #include <string.h> #define MAX(a,b) (a)>(b)?(a):(b) int main(int argc, char *argv[]) { int s,connectReturn, maxfd; fd_set rset; char sendbuf[1024] = {0}; char recvbuf[1024] = {0}; long port=2900; if (argc < 2) { printf("Usage: %s <Address>\n", argv[0]); return 0; } s=socket(PF_INET,SOCK_STREAM,0); struct sockaddr_in sa; sa.sin_family=AF_INET; sa.sin_addr.s_addr=inet_addr(argv[1]); sa.sin_port=htons(port); connectReturn=connect(s,(struct sockaddr *)&sa,sizeof(sa)); printf("connct ret = %d\n",connectReturn); FD_ZERO(&rset); while(1) { FD_SET(fileno(stdin), &rset); FD_SET(s, &rset); maxfd=MAX(fileno(stdin), s) + 1; select(maxfd, &rset, NULL, NULL, NULL); if(FD_ISSET(fileno(stdin), &rset)) { scanf("%s", sendbuf); send(s, sendbuf, strlen(sendbuf), 0); bzero(sendbuf, 1024); } else if(FD_ISSET(s, &rset)) { memset(recvbuf, 0, 1024); recv(s, recvbuf, 1024, 0); printf("remote: %s\n", recvbuf); } } return 0; } /***server********************************************/ #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <errno.h> #include <string.h> #include <signal.h> #include <sys/wait.h> #include <sys/select.h> #include <sys/time.h> #include <unistd.h> #define BUFLEN 1024 #define MAX(a,b) ((a)>(b)?(a):(b)) typedef void Sigfunc (int); void str_echo(FILE *,int); //Sigfunc *signal(int, Sigfunc *); int main(int argc,char **argv) { int connfd, listenfd; pid_t childpid; socklen_t clilen; struct sockaddr_in cliaddr,servaddr; void sig_chld(int); listenfd = socket(AF_INET, SOCK_STREAM, 0); memset(&servaddr,0,sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(2900); bind(listenfd,(struct sockaddr*)&servaddr, sizeof(servaddr)); listen(listenfd, 8); signal(SIGCHLD, sig_chld); while(1) { clilen = sizeof(cliaddr); if((connfd = accept(listenfd, (struct sockaddr*)&cliaddr, &clilen)) < 0) { if(errno == EINTR) { fputs("accept error: EINTR\n", stdout); continue; } else { fputs("accept error..\n", stdout); } } if((childpid = fork()) == 0) { close(listenfd); str_echo(stdin, connfd); exit(0); } close(connfd); } }
void str_echo(FILE *fp,int sockfd)
{
int n = 0;
char sendbuf[BUFLEN] = { 0 },recvbuf[BUFLEN] = { 0 };
int maxfdp;
fd_set rset;
FD_ZERO(&rset);
while(1)
{
FD_SET(fileno(fp),&rset);
FD_SET(sockfd, &rset);
maxfdp = MAX(fileno(fp),sockfd)+1;
select(maxfdp, &rset ,NULL, NULL, NULL);
if(FD_ISSET(sockfd, &rset))
{
if(n = read(sockfd, recvbuf, BUFLEN) == 0)
{
return;
}
if(n == -1)
{
break;
}
printf("%s\n",recvbuf);
memset(recvbuf,0,BUFLEN);
}
if(FD_ISSET(fileno(fp),&rset))
{
scanf("%s",sendbuf);
write(sockfd, sendbuf,strlen(sendbuf));
}
}
}
void sig_chld (int signo)
{
pid_t pid;
int stat;
while ((pid = waitpid(-1,&stat, WNOHANG)) > 0)
{
printf("child %d terminated\n",pid);
}
return;
}
浙公网安备 33010602011771号