linux——网络编程实战

    • scoket()指定各种协议

int socket(int domain, int type, int protocol);
    • bink()设置地址

端口号port的设置

需要先把字节序给调整一下,把主机的字节序调整为网络字节序

字节序转换api有如下:

#include <netinet/in.h>

uint16_t htons(uint16_t host16bitvalue);    //返回网络字节序的值
uint32_t htonl(uint32_t host32bitvalue);    //返回网络字节序的值
uint16_t ntohs(uint16_t net16bitvalue);     //返回主机字节序的值
uint32_t ntohl(uint32_t net32bitvalue);     //返回主机字节序的值

h代表host,n代表net,s代表short(两个字节),l代表long(4个字节),通过上面的4个函数可以实现主机字节序和网络字节序之间的转换。有时可以用INADDR_ANY,INADDR_ANY指定地址让操作系统自己获取

IP地址的结构体的设置

需要将主机的字符串型ip地址转换为网络的地址

地址转换API

int inet_aton(const char* straddr,struct in_addr *addrp);//把字符串形式的“192.168.1.123”转为网络能识别的格式
char* inet_ntoa(struct in_addr inaddr); //把网络格式的ip地址转为字符串形式

    • listen()监听

listen(s_fd,10);

    • accept()接收

    • read()读

read(c_fd,readbuf,128);
    • write()写

 write(c_fd,"i get your message",128);

客户端:

socket 、connect 、 read 、write

显而易见,相比服务端,客户端少了几个API,多了一个connet

connet:

代码如下:

server:

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

//int socket(int domain, int type, int protocol);
int main(int argc,char ** argv)
{
        int s_fd;
        int c_fd;
        int n_read;
        char readbuf[128];
        char *msg ="i get message";
        struct sockaddr_in s_addr;
        struct sockaddr_in c_addr;
        memset(&c_addr,0,sizeof(struct sockaddr_in));
        memset(&s_addr,0,sizeof(struct sockaddr_in));
//      1.socket
        s_fd =socket(AF_INET,SOCK_STREAM,0);
        if(s_fd == -1){
                perror("socket");
                exit(-1);

        }
//      2.bind
        s_addr.sin_family = AF_INET;
        s_addr.sin_port = htons(atoi(argv[2]));
        inet_aton(argv[1],&s_addr.sin_addr);
        bind(s_fd,(const struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
//      3.listen
        listen(s_fd,10);
//      4.accept
//      c_fd = accept(s_fd,NULL,NULL);   
        int clen  = sizeof(struct sockaddr_in);


        c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&clen);
        if(c_fd == -1){
                perror("accept");
        }

        printf("connect sucess!\n");


//      5.read

        n_read = read(c_fd,readbuf,128);
        if(n_read == -1){

        perror("read");

        }else{

        printf("get message:%d,%s\n",n_read,readbuf);

        }
//      6.write
        write(c_fd,msg,strlen(msg));

        return 0;
}
~       

client:

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

//int socket(int domain, int type, int protocol);
int main(int argc,char ** argv)
{
        int c_fd;
        int n_read;

        char readbuf[256];
        char *msg ="From client";

        struct sockaddr_in c_addr;
        memset(&c_addr,0,sizeof(struct sockaddr_in));
//      1.socket
        c_fd =socket(AF_INET,SOCK_STREAM,0);
        if(c_fd == -1){
                perror("socket");
                exit(-1);

        }
        c_addr.sin_family = AF_INET;
        c_addr.sin_port = htons(atoi(argv[2]));
        inet_aton(argv[1],&c_addr.sin_addr);
//      connect
        if(connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr)) == -1){
                perror("connect");
                exit(-1);

        }else{


        }

        write(c_fd,msg,strlen(msg));

//      5.read

        n_read = read(c_fd,readbuf,256);
        if(n_read == -1){

        perror("read");

        }else{

        printf("get message:%d,%s\n",n_read,readbuf);

        }

        return 0;
}
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值