服务端
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 8888
#define BACKLOG 2 // 帧听端口长度
void process_conn_server(int s);
int main()
{
int ss,sc; //ss 为服务器socket描述符,sc 为客户端socket的描述符号
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)
{
printf("socker 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);
//绑定地址和套接字
err = bind(ss, (struct sockaddr*)&server_addr, sizeof(server_addr));
if (err < 0)
{
printf("listen error\n");
return -1;
}
//设置帧听队列
err =listen(ss, BACKLOG);
if(err < 0)
{
printf("listen error\n");
return -1;
}
for(;;)
{
socklen_t 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);
}
}
}
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 altogeter\n", size);
write(s, buffer, strlen(buffer) + 1);
}
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PROT 8888
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);
}
}
}
int main(int argc,int **argv)
{
int s;
struct sockaddr_in server_addr;
s = socket(AF_INET, SOCK_STREAM, 0);
if(s < 0)
{
printf("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);
server_addr.sin_port = htons(PROT);
inet_pton(AF_INET, argv[1], &server_addr.sin_addr);
connect(s, (struct sockaddr*)&server_addr, sizeof(struct sockaddr));
process_conn_client(s);
close(s);
return 0;
}
感想
其实linux有很多的sock的程序的例子
mpc mpd
浏览器 服务器
一时间想不起来了
好像蓝牙也是......
signal 信号注册处理函数
//挂接信号
void sig_pipe(int sign)
{
printf("Catch a SIGPIPE signal\n");
}
signal(SIGPIPE, sig_pipe);//这个 放在main 里面,我去看着这个像是 放在文件最底下的方式,发现一直没成功,哭... ...
---------------------------我的天空里没有太阳,总是黑夜,但并不暗,因为有东西代替了太阳。虽然没有太阳那么明亮,但对我来说已经足够。凭借着这份光,我便能把黑夜当成白天。我从来就没有太阳,所以不怕失去。
--------《白夜行》