今天学习了网络编程的一些知识,在这里进行总结和复习。
首先,需要一个客户端和服务端。
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;
}
以上。