网络编程(新手笔记)

今天学习了网络编程的一些知识,在这里进行总结和复习。
首先,需要一个客户端和服务端。
server端(接听电话的人):
1.socket-----------------有一个电话
2.bind-------------------绑定一个卡,并把号码告诉别人(自己的号)
3.listen-----------------待机,等待别人打电话进来
4.accept-----------------接电话
5.recv/send--------------通话过程
6.close------------------挂机

client端(打电话的人):
1.socket-----------------有一个电话
2.connect----------------拨打电话(指定对方的号码)
3.recv/send--------------通话过程
4.close------------------挂机

需要用到的一个函数socket,具体定义如下:
在这里插入图片描述
服务端代码:
server.c

#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <stdio.h>
//#include <linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv) {
    int s_fd;
    int c_fd;
    char readBuf[128];
    int nread;
    int mark = 0;

   // char *msg = "I get your connect";
    char msg[128]= {0};
    struct sockaddr_in c_addr;
    struct sockaddr_in s_addr;

    if(argc != 3){
        printf("Argument of perameter\n");
        exit(-1);
    }

    memset(&s_addr, 0, sizeof(struct sockaddr_in));
    memset(&c_addr, 0, sizeof(struct sockaddr_in));
    // 1 socket
    s_fd = socket(AF_INET, SOCK_STREAM, 0);		//第一步创建socket,第一个参数为IPv4协议,第二个参数指定socket的类型,第三个默认0
    if (s_fd == -1) {
        perror("Socket");
        exit(-1);
    }

    s_addr.sin_family = AF_INET;									
    s_addr.sin_port = htons(atoi(argv[2]));		//htons把本机字节顺序转化为网络字节顺序,atoi将ASCII码转换成int型,argv[2]是main函数的第二个参数
    inet_aton(argv[1], &s_addr.sin_addr);		//将字符串ip地址转换成数字

    // 2 bind
    bind(s_fd, (struct sockaddr *)&s_addr, sizeof(struct sockaddr_in));	//第二步,设置IP地址和端口号

    // 3 listen
    listen(s_fd, 10);							//监听

    // 4 accept
    int clen = sizeof(struct sockaddr_in);
    while (1) {
        c_fd = accept(s_fd, (struct sockaddr *)&c_addr, &clen);	//第四步,监听到有客户端接入,接收一个连接

        if (c_fd == -1) {
            perror("Accept");
        }
        mark++;									//用于标记客户端数量

        printf("Get connect:%s\n", inet_ntoa(c_addr.sin_addr));

        if (fork() == 0) {						//创建一个子进程
        
            if(fork() == 0){					//再创建一个子进程
            	while(1){						//用一个循环不断地将用户输入的数据写入
                	sprintf(msg,"Welcome No.%d client",mark);
                	write(c_fd, msg, strlen(msg));
                	sleep(3);
           		}
            }

        // 5 read
        while(1){								//用一个循环不断读取客户端输入的内容
        memset(readBuf,0,sizeof(readBuf));
        nread = read(c_fd, readBuf, 128);
        if (nread == -1) {
            perror("Read");
        } else {
            printf("Get message:%d,%s\n", nread, readBuf);
        }
        }
        break;
    }
}
return 0;
}

客户端代码:
client.c

#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <stdio.h>
//#include <linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv) {
    int c_fd;
    char readBuf[128];
    int nread;
    char msg[128]={0};
  //  char *msg = "Message from client";

    struct sockaddr_in c_addr;

    if(argc != 3){
        printf("Argument of perameter\n");
        exit(-1);
    }

    memset(&c_addr, 0, sizeof(struct sockaddr_in));
    // 1 socket
    c_fd = socket(AF_INET, SOCK_STREAM, 0);		//第一步,创建一个socket
    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);

    // 2 connect
    if (connect(c_fd, (struct sockaddr *)&c_addr, sizeof(struct sockaddr)) ==  -1) {	//第二步,连接服务端
        perror("Connect");
        exit(-1);
    }
    while (1) {
        if (fork() == 0) {								//创建一个子进程
            while(1){									//用一个循环来不断获取输入的内容并写入到msg
            	memset(msg,0,sizeof(msg));
            	printf("Input: ");
            	gets(msg);
            	write(c_fd, msg, strlen(msg));
        	}
        }
        while(1){
        	memset(readBuf,0,sizeof(readBuf));
        	nread = read(c_fd, readBuf, 128);			//读取输入的内容到readBuf中
        	if (nread == -1) {
           		perror("Read");
        	} else {
            	printf("Get message from server:%d,%s\n", nread, readBuf);
        	}
        }
    }
    return 0;
}

以上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值