linux网络设备测试-----socket

本文介绍了一个简单的TCP客户端与服务器程序实现,通过代码示例展示了如何建立连接、发送和接收数据。客户端通过指定IP地址连接服务器,并发送消息;服务器监听特定端口,接收并响应客户端请求。
/*******************************
*     客户端程序  *
********************************/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>

int main(int argc,char *argv[])
{
    int sockfd,numbytes;
    char buf[100];
    struct hostent *he;
    struct sockaddr_in their_addr;
    //从输入的命令行的第2个参数获取服务器的IP地址
    he = gethostbyname(argv[1]);
    //客户端建立TCP协议的socket套接字描述符
    if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1)
       {
        perror("socket");
        exit(1);
       }

    //客户端初始化结构体,连接到服务器的4321端口
    their_addr.sin_family = AF_INET;
    their_addr.sin_port = htons(4321);
    their_addr.sin_addr = *((struct in_addr *)he->h_addr);
    bzero(&(their_addr.sin_zero),8);

    //向服务器发起连接
    if(connect(sockfd,(struct sockaddr *)&their_addr,sizeof(struct sockaddr_in))==-1)
      {
        perror("connect");
        exit(1);
      }

    //向服务器发送字符串"hello!"
    if(send(sockfd,"Hello! I am Client.",100,0)==-1)
      {
        perror("send");
                exit(1);
      }

    //接收从服务器返回的信息
    if(recv(sockfd,buf,100,0)==-1)
      {
        perror("recv");
        exit(1);
      }
 
        printf("result:  %s \n",buf);
         /*通信结束*/
        close(sockfd);
        return 0;

}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

makefile:

EXTRA_LIBS += -lpthread
CC=gcc
EXEC =  ./client
OBJS = client.o

all: $(EXEC)

$(EXEC): $(OBJS)
    $(CC) $(LDFLAGS) -o $@ $(OBJS) $(EXTRA_LIBS)


install:
    $(EXP_INSTALL) $(EXEC) $(INSTALL_DIR)

clean:
    -rm -f $(EXEC) *.elf *.gdb *.o

_____________________________________________________



/*******************************
*       server.c    *
********************************/
#include <sys/types.h>//socket
#include <sys/socket.h>//socket
#include <stdio.h>//printf
#include <stdlib.h>//exit
#include <errno.h>
#include <string.h>//bzero
//#include <unistd.h>
#include <netinet/in.h>//sockaddr_in

#define SERVER_PORT 4321

int main()
 {
    int sockfd,new_fd;
    struct sockaddr_in my_addr;
    struct sockaddr_in their_addr;
    int sin_size;
        char buff[100];

    //服务器建立TCP协议的socket套接字描述符
    if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1)
        {
        perror("socket");
        exit(1);
    }
      printf("socket success!,sockfd=%d\n",sockfd);
 
    //初始化sockaddr结构体,绑定4321端口
     my_addr.sin_family = AF_INET;
     my_addr.sin_port = htons(SERVER_PORT);
    my_addr.sin_addr.s_addr = INADDR_ANY;
    bzero(&(my_addr.sin_zero),8);

    //绑定套接字描述符sockfd
    if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr_in))==-1)
      {
            perror("bind");
        exit(1);
    }
    printf("bind success!\n");

    //创建监听套接字描述符sockfd
    if(listen(sockfd,10)==-1)
    {
         perror("listen");  
         exit(1);
    }
    printf("listening....\n");


      //服务器阻塞监听套接字,等待客户端程序连接
        while(1)
      {
        sin_size = sizeof(their_addr);

    // 如果创建连接,将产生一个全新的套接字
                if((new_fd = accept(sockfd,(struct sockaddr *)&their_addr,&sin_size))==-1)
           {
            perror("accept");
                   exit(1);
         }
    
        // bzero(buff, 100);
        //生成一个子进程来完成和客户端的会话,父进程继续监听
                if(!fork())
          {
        //读取客户端发来的信息
        if(recv(new_fd,buff,100,0)==-1)
               {
              perror("recv");
                 exit(1);
            }
        printf(" %s\n",buff);
        //发送信息到客户端
         if(send(new_fd,"Welcome,This is Server.",50,0)==-1)
          perror("send");
              
          /*本次通信结束*/
         close(new_fd);
        exit(0);
     }
         /*下一个循环*/
  }
    close(sockfd);
 }

/*
root@1[server]# ./server
server is run: Success
  Hello!  Client connect.

root@2[client]# .client 192.168.1.99
  result: Welcome,This is Server.
*/

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

makefile:

EXTRA_LIBS += -lpthread
CC = arm-poky-linux-gnueabi-gcc
EXEC =  ./server
OBJS = server.o

all: $(EXEC)

$(EXEC): $(OBJS)
    $(CC) $(LDFLAGS) -o $@ $(OBJS) $(EXTRA_LIBS)


install:
    $(EXP_INSTALL) $(EXEC) $(INSTALL_DIR)

clean:
    -rm -f $(EXEC) *.elf *.gdb *.o

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值