server端
#include<stdio.h>
#include<stdlib.h>
#include<string.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)
{
ssize_t size = 0;
char buffer[1024];
printf("enter process\n");
for(;;){
bzero(buffer, sizeof(buffer));
size = read(s, buffer, 1024);
printf("read data:%s\n", buffer);
if(size == 0) {
return;
}
sprintf(buffer, "%ld bytes altogether\n", size-1);
write(s, buffer, strlen(buffer)+1);
}
}
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) {
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);
err = bind(ss, (struct sockaddr*)&server_addr, sizeof(server_addr));
if(err < 0) {
printf("bind 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;
} else {
printf("connect:\n");
}
pid = fork();
if(pid == 0) {
process_conn_server(sc);
close(ss);
} else {
close(sc);
}
}
}
client端
#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 PORT 8888
void process_conn_client(int s)
{
ssize_t size = 0;
char buffer[1024];
char *buffer1 = "holle world";
printf("enter process\n");
for(;;){
printf("\n");
printf("input data>");
fgets(buffer, sizeof(buffer), stdin);
size = strlen(buffer);
printf("write: %s\n", buffer);
if(size > 0) {
write(s, buffer, size);
size = read(s, buffer, 1024);
printf("read : %s \n", buffer);
}
}
}
int main(int argc, char *argv[])
{
int s;
struct sockaddr_in server_addr;
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);
connect(s, (struct sockaddr*)&server_addr, sizeof(struct sockaddr));
process_conn_client(s);
close(s);
return 0;
}
打開一個界面執行服務端,並等待客戶端連接
kayshi@ubuntu:~/code/net_socket/server$ ./server
connect:
enter process
read data:1
read data:12
read data:123
read data:1234
read data:12345
read data:123456
read data:1234567
在客戶端數據數據,會得到服務器返回的數據計數的字符串
kayshi@ubuntu:~/code/net_socket/client$ ./client
enter process
input data>1
write: 1
read : 1 bytes altogether
input data>12
write: 12
read : 2 bytes altogether
input data>123
write: 123
read : 3 bytes altogether
input data>1234
write: 1234
read : 4 bytes altogether
input data>12345
write: 12345
read : 5 bytes altogether
input data>123456
write: 123456
read : 6 bytes altogether
input data>1234567
write: 1234567
read : 7 bytes altogether