linux网络通信(TCP和UDP)

来源:互联网 发布:c语言中运算符的优先级 编辑:程序博客网 时间:2024/06/05 16:12

1 TCP方式

2  服务器

/*server.c*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <netinet/in.h>
#define PORT 4321
#define BUFFER_SIZE  1024
#define MAX_QUE_CONN_NM   5
int main()
{
struct sockaddr_in server_sockaddr, client_sockaddr;
int sin_size, recvbytes;
int sockfd, client_fd;
char buf[BUFFER_SIZE];
/*建立 socket 连接*/
if ((sockfd = socket(AF_INET,SOCK_STREAM,0))== -1)
{
perror("socket");
exit(1);
}
printf("Socket id = %d\n",sockfd);
/*设置 sockaddr_in 结构体中相关参数*/
server_sockaddr.sin_family = AF_INET;
server_sockaddr.sin_port = htons(PORT);
server_sockaddr.sin_addr.s_addr = INADDR_ANY;

//服务器可以监听所有网卡SERVPORT端口上接受到的数据。

//作为服务器,你要绑定【bind】到本地的IP地址上进行监听【listen】,

//但是你的机器上可能有多块网卡,也就有多个IP地址,这时候你要选择绑定在哪个IP上面,//如果指定为INADDR_ANY,那么系统将绑定默认的网卡【即IP地址】


bzero(&(server_sockaddr.sin_zero), 8);
int i = 1;/* 使得重复使用本地地址与套接字进行绑定 */
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));

if (bind(sockfd, (struct sockaddr*)&server_sockaddr, sizeof(struct sockaddr))== -1)
{
perror("bind");
exit(1);
}
printf("Bind success!\n");
if (listen(sockfd, MAX_QUE_CONN_NM) == -1)
{
perror("listen");
exit(1);
}
printf("Listening....\n");
sin_size = sizeof(struct sockaddr_in);
/*调用 accept 函数,等待客户端的连接*/
if((client_fd=accept(sockfd,(struct sockaddr *)&client_sockaddr, &sin_size)) == -1)
{
perror("accept");
exit(1);
}

/*调用 recv 函数接收客户端的请求*/
memset(buf , 0, sizeof(buf));
if ((recvbytes = recv(client_fd, buf, BUFFER_SIZE, 0)) ==-1)
{
perror("recv");
exit(1);
}
printf("Received a message: %s\n", buf);
close(sockfd);
exit(0);
}

# ./server

3  客户

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <netdb.h>
#include <netinet/in.h>
#define PORT 4321
#define BUFFER_SIZE 1024
int main(int argc, char *argv[])
{
int sockfd, sendbytes;
char buf[BUFFER_SIZE];
struct hostent *host;
struct sockaddr_in serv_addr;
if(argc < 3)
{
fprintf(stderr,"USAGE: ./client Hostname(or ip address)Text\n");
exit(1);
}

/*地址解析函数*/
if ((host = gethostbyname(argv[1])) == NULL)
{
perror("gethostbyname");
exit(1);
}
memset(buf, 0, sizeof(buf));
sprintf(buf, "%s", argv[2]);
/*创建 socket*/
if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
{
perror("socket");
exit(1);
}

/*设置 sockaddr_in 结构体中相关参数*/
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
bzero(&(serv_addr.sin_zero), 8);
/*调用 connect 函数主动发起对服务器端的连接*/
if(connect(sockfd,(struct sockaddr*)&serv_addr,sizeof(struct sockaddr)) == -1)
{
perror("connect");
exit(1);
}

/*发送消息给服务器端*/
if ((sendbytes = send(sockfd, buf, strlen(buf), 0)) == -1)
{
perror("send");
exit(1);
}
close(sockfd);
exit(0);
}

# ./client localhost(或者 IP 地址) Hello!

 gcc -o  server  server.c      gcc -o client client.c





2  udp方式

该实例分为客户端和服务器端,其中服务器端首先建立起 socket,然后
调用本地端口的绑定,
接着就开始等待客户端建立联系。
客户端则在建立 socket 之后直
接往上面扔数据,不需要与服务器建立连接。



server.c

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

int port=8888;

int main()
{
int sockfd;
int len;
int z;
char buf[256];
struct sockaddr_in adr_inet;
struct sockaddr_in adr_clnt;
printf("等待客户端....\n");

/* 建立 IP 地址 */
adr_inet.sin_family=AF_INET;
adr_inet.sin_port=htons(port);
adr_inet.sin_addr.s_addr =htonl(INADDR_ANY);
bzero(&(adr_inet.sin_zero),8);
len=sizeof(adr_clnt);

/* 建立 socket */

sockfd=socket(AF_INET,SOCK_DGRAM,0);
if(sockfd==-1)
{
perror("socket 出错");
exit(1);
}
/* 绑定 socket */
z=bind(sockfd,(struct sockaddr*)&adr_inet,sizeof(adr_inet));
if(z==-1)
{
perror("bind 出错");
exit(1);
}


while(1)

{
 /* 接受传来的信息 */
    z=recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&adr_clnt,&len);
     if(z<0)
            {
             perror("recvfrom 出错");
             exit(1);
            }
        buf[z]=0;
        printf("接收:%s", buf);
 /* 收到 stop 字符串,终止连接*/
     if(strncmp(buf,"stop",4)==0)
       {
        printf("结束....\n");
        break;
       }
}

close(sockfd);
exit(0);

}


client.c


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

int port=8888;

int main()
{

   int sockfd;
   int i=0;
   int z;
   char buf[80],str1[80];
   struct sockaddr_in adr_srvr;
   FILE *fp;
   printf("打开文件......\n");

/*以只读的方式打开 liu 文件*/

    fp=fopen("liu","r");
   if(fp==NULL)
         {
          perror("打开文件失败");
         exit(1);
         }
printf("连接服务端...\n");

/* 建立 IP 地址 */

     adr_srvr.sin_family=AF_INET;
     adr_srvr.sin_port=htons(port);
     adr_srvr.sin_addr.s_addr = htonl(INADDR_ANY);
     bzero(&(adr_srvr.sin_zero),8);
     sockfd=socket(AF_INET,SOCK_DGRAM,0);
        if(sockfd==-1)
            {
             perror("socket 出错");
             exit(1);
            }

printf("发送文件 ....\n");

/* 读取三行数据,传给 udpserver*/
for(i=0;i<3;i++)
{
   fgets(str1,80,fp);
   printf("%d:%s",i,str1);
   sprintf(buf,"%d:%s",i,str1);

    z=sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr * )&adr_srvr,sizeof(adr_srvr));
   if(z<0)
         {
         perror("send 出错");
          exit(1);
         }
}

       printf("发送.....\n");
       sprintf(buf,"stop\n");
z=sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&adr_srvr,sizeof(adr_srvr));

   if(z<0)
     {
    perror("sendto 出错");
    exit(1);
    }

fclose(fp);
close(sockfd);

exit(0);
}

gcc -o  server  server.c      gcc -o client client.c
























































0 0