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;
}

 

posted on 2013-02-27 17:58  cfox  阅读(1250)  评论(0)    收藏  举报

导航