linux下实现socket连接示例(server端)

/*功能:    实现将客户端传来的小写字符串转化为大写,在传输会客户端
*测试方法1:
    1)先    gcc server.c -o server 
    2)执行  ./server
    3)在linux再起一个终端 输入命令   nc 127.0.0.1 6666     回车  //n代表net c代表connect
    4)输入hello socket 回车
    5)客户接收到服务端返回 HELLO SOCKET

*函数1:    int socket(int domain, int type, int protocol);
    参数:  domain    通信地址族,AF_INET代表IPV4协议,AF_INET6代表IPV6协议(常用)
            type     SOCK_STREAM表示套接字使用TCP协议,SOCK_DGRAM表示套接字使用UDP协议(常用)
            protocol 一般设置为0,表示使用默认协议

*函数2:     htonl()和htons()作用是将本地字节序转换为网络字节序
            注意:但是前提是只接收int型数据,如果是字符串类型转网络字节序则需要inet_pton()函数
            网络字节序含义:由于网络协议规定数据格式为大端(低地址-高位)存储,而本地数据不一定是,所以在传输时需要转换
     参数: INADDR_ANY是让系统自动获取当前IP,int型宏       

*函数3:    int bind(int sockfd, const struct socket sockaddr *addr, socklen_t addrlen);
            用于绑定IP和端口,所以要传入含有IP和端口的结构体

*函数4:    int listen(int sockfd,int backlog);   backlog设置最大监听个数

*函数5:    int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);  //阻塞等待连接请求
            客户端想要和服务端创建连接之前,先要完成三次握手机制,完成后加入连接队列,服务器调用accept()时从队列中
            获取客户端信息,处理连接请求;如果连接队列为空时,accept()就会阻塞等待
    参数:  sockfd:注意这里的套接字是服务器创建的套接字
            addr:  这个是一个传出参数,是客户端的地址结构体
            addrlen:这个是一个传入传出参数,会根据结构体的的实际长度传出
            return: accept()的返回值是一个套接字,该套接字用于本次通信的客户端进行数据交互

*/

#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>  //sockaddr_in 头文件
#include <stdlib.h>
#include <ctype.h>      //toupper()头文件

#define SERV_PORT   6666            //不能大于65535,    1000一下的端口是系统使用
#define SERV_IP     "127.0.0.1"

int main()
{
    int lfd,cfd;            
    struct sockaddr_in serv_addr,clie_addr;
    socklen_t clie_addr_len;
    char buf[BUFSIZ];       //这里BUFSIZ是预定义的一个宏,可能是4k大小
    int n,i;                

    lfd = socket(AF_INET, SOCK_STREAM, 0);  //创建套接字
    if(lfd == -1)
    {
        printf("socket create failed\n");
        return -1;
    }

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port   = htons(SERV_PORT);    //将本地字节序转换为网络字节序,htons->host to network short  short为16为的端口号
    serv_addr.sin_addr.s_addr   = htonl(INADDR_ANY);      
    bind(lfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));   //绑定IP+端口,注意这里要强转

    listen(lfd, 128);       //默认最大连接数为128

    clie_addr_len = sizeof(clie_addr);
    cfd = accept(lfd, (struct sockaddr *)&clie_addr, &clie_addr_len);//clie_addr_len是传入 传出参数,所以不能直接sizeof传入,否则无法传出参数

    while(1)
    {
        n = read(cfd, buf, sizeof(buf));    //n为实际读到的字节
        for(i = 0; i < n; i++)
        {
            buf[i] = toupper(buf[i]);       //将每个字符都转换为大写
        }
    
        write(cfd, buf, n);                 //将修改后的数据写回到客户端,注意不能是sizeof,必须是n个字节(接收的字节数)
    }
    

    close(lfd);                         //结束连接
    close(cfd);

    return 0;
}

在centos系统中,没有nc命令的话执行yum install -y nc 下载,其他系统请自查

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值