Linux-C网络编程

用到的代码:

#include <arpa/inet.h>

uint32_t htonl(uint32_t hostlong);

uint16_t htons(uint16_t hostshort);

uint32_t ntohl(uint32_t netlong);

uint16_t ntohs(uint16_t netshort);

#IPv4的函数原型:

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

int inet_aton(const char *straddr, struct in_addr *addrptr);

char *inet_ntoa(struct in_addr inaddr);

in_addr_t inet_addr(const char *straddr);

#用到的代码:

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main()
{
    char ip[] = "192.168.0.101";
    struct in_addr myaddr;

    /* inet_aton 32字节序*/
    int iRet = inet_aton(ip, &myaddr);
    printf("%x\n", myaddr.s_addr);

    /* inet_addr 32字节序*/
    printf("%x\n", inet_addr(ip));

    /* inet_pton 32字节序*/
    iRet = inet_pton(AF_INET, ip, &myaddr);
    printf("%x\n", myaddr.s_addr);
    myaddr.s_addr = 0xac100ac4;

    /* inet_ntoa 输出点分十进制IP*/
    printf("%s\n", inet_ntoa(myaddr));

    /* inet_ntop 输出点分十进制IP*/
    inet_ntop(AF_INET, &myaddr, ip, 16);
    puts(ip);
    return 0;
}

TCP程序实例

/*server.c*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/shm.h>

#define MYPORT  8887
#define QUEUE   20
#define BUFFER_SIZE 1024

int main()
{
    ///定义sockfd
    int server_sockfd = socket(AF_INET,SOCK_STREAM, 0);


//定义sockaddr_in
struct sockaddr_in server_sockaddr;
server_sockaddr.sin_family = AF_INET;
server_sockaddr.sin_port = htons(MYPORT);
server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);

///bind,成功返回0,出错返回-1
if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr))==-1)
{
    perror("bind");
    exit(1);
}

printf("监听%d端口\n",MYPORT);
///listen,成功返回0,出错返回-1
if(listen(server_sockfd,QUEUE) == -1)
{
    perror("listen");
    exit(1);
}

///客户端套接字
char buffer[BUFFER_SIZE];
struct sockaddr_in client_addr;
socklen_t length = sizeof(client_addr);

printf("等待客户端连接\n");
///成功返回非负描述字,出错返回-1
int conn = accept(server_sockfd, (struct sockaddr*)&client_addr, &length);
if(conn<0)
{
    perror("connect");
    exit(1);
}
printf("客户端成功连接\n");

while(1)
{
    memset(buffer,0,sizeof(buffer));
    int len = recv(conn, buffer, sizeof(buffer),0);
    //客户端发送exit或者异常结束时,退出
    if(strcmp(buffer,"exit\n")==0 || len<=0)
        break;
    printf("来自客户端数据:%s\n",buffer);
    send(conn, buffer, len, 0);
    printf("发送给客户端数据:%s\n",buffer);
}
close(conn);
close(server_sockfd);
return 0;
}

基于UDP的网络程序

/*client.c*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/shm.h>

#define MYPORT  8887
#define BUFFER_SIZE 1024
char* SERVER_IP = "127.0.0.1";

int main()
{
    ///定义sockfd
    int sock_cli = socket(AF_INET,SOCK_STREAM, 0);


///定义sockaddr_in
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(MYPORT);  ///服务器端口
servaddr.sin_addr.s_addr = inet_addr(SERVER_IP);  ///服务器ip

printf("连接%s:%d\n",SERVER_IP,MYPORT);
///连接服务器,成功返回0,错误返回-1
if (connect(sock_cli, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
{
    perror("connect");
    exit(1);
}
printf("服务器连接成功\n");
char sendbuf[BUFFER_SIZE];
char recvbuf[BUFFER_SIZE];
while (fgets(sendbuf, sizeof(sendbuf), stdin) != NULL)
{
    printf("向服务器发送数据:%s\n",sendbuf);
    send(sock_cli, sendbuf, strlen(sendbuf),0); ///发送
    if(strcmp(sendbuf,"exit\n")==0)
        break;
    recv(sock_cli, recvbuf, sizeof(recvbuf),0); ///接收
    printf("从服务器接收数据:%s\n",recvbuf);

    memset(sendbuf, 0, sizeof(sendbuf));
    memset(recvbuf, 0, sizeof(recvbuf));
}

close(sock_cli);
return 0;

}
-------------本文结束❤感谢阅读-------------

本文标题:Linux-C网络编程

文章作者:MaiKeFee

发布时间:2019年09月19日

最后更新:2019年09月19日

原始链接:http://MaiKeFee.com/archives/c16f1d53.html