目的:编写简单的服务器到客户端通信小程序。
1. 服务端代码
/************
* servise.c 服务端程序源码
*/
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <linux/in.h>
#define PORT 8885
#define BACKLOG 2
int main(int argc, char *argv[])
{
int ss, sc;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int err;
pid_t pid;
ss = socket(AF_INET, SOCK_STREAM, 0);
if (ss < 0){
perror("socket error!");
return -1;
}
bzero(&server_addr, sizeof(server_addr)); // 清零
server_addr.sin_family=AF_INET; // 指定协议
server_addr.sin_addr.s_addr=htonl(INADDR_ANY); // htonl() 函数 主机到网络字节序转换 指定地址为INADDR_ANY
server_addr.sin_port = htons(PORT); // 指定端口号
err = bind(ss, (struct sockaddr *)&server_addr, sizeof(server_addr)); // 绑定套接字 强制类型转换 sockaddr_in -> sockaddr
if (err < 0){
printf("listen error!\n");
return -1;
}
err = listen(ss, BACKLOG); // 启动监听
if (err < 0){
printf("listen error!\n");
return -1;
}
for(;;) {
int addrlen = sizeof(struct sockaddr);
sc = accept(ss, (struct sockaddr*)&client_addr, &addrlen); //接受客户端连接
if (sc < 0){
continue;
}
pid=fork();
if (pid == 0){
close(ss);
process_conn_server(sc); // 服务端处理函数
}else{
close(sc);
}
}
}
2. 客户端代码
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <linux/in.h>
#define PORT 8885
int main(int argc, char *argv[])
{
int s;
struct sockaddr_in server_addr;
int err;
s = socket(AF_INET, SOCK_STREAM, 0);
if (s < 0){
printf("socket error!\n");
return -1;
}
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(PORT);
inet_pton(AF_INET, argv[1], &server_addr.sin_addr); // inet_pton() 字符串格式转换到2进制
connect(s, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)); // 建立连接
process_conn_client(s); // 客户端处理程序
close(s);
}
3. 处理程序
#include <stdio.h>
#include <string.h>
void process_conn_server(int s)
{
ssize_t size = 0;
char buffer[1024];
for(;;) {
size = read(s, buffer, 1024);
if (size == 0){
return ;
}
sprintf(buffer, "%d bytes altogether\n", size);
write(s, buffer, strlen(buffer)+1);
}
}
void process_conn_client(int s)
{
ssize_t size = 0;
char buffer[1024];
for(;;){
size = read(0, buffer, 1024);
if (size > 0){
write(s, buffer, size);
size = read(s, buffer, 1024);
write(1, buffer, size);
}
}
}