查看while源代码
服务器代码
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#define portnumber 3333
int main(int argc, char* argv[]) {
int local_listen_socket, server_session_socket;
struct sockaddr_in server_addr_info_struct;
struct sockaddr_in client_addr_info_struct;
int size_of_sockaddr_in;
int read_got_bytes_nr;
char buffer[1024];
if ((local_listen_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
fprintf(stderr, "Socket error:%s\n\a", strerror(errno));
exit(1);
}
bzero(&server_addr_info_struct, sizeof(struct sockaddr_in));
server_addr_info_struct.sin_family = AF_INET;
server_addr_info_struct.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr_info_struct.sin_port = htons(portnumber);
if (bind(local_listen_socket, (struct sockaddr*)(&server_addr_info_struct), sizeof(struct sockaddr)) == -1) {
fprintf(stderr, "ERR bind():%s\n\a", strerror(errno));
exit(1);
}
if (listen(local_listen_socket, 5) == -1) {
fprintf(stderr, "ERR listen():%s\n\a", strerror(errno));
exit(1);
}
while (1) {
size_of_sockaddr_in = sizeof(struct sockaddr_in);
fprintf(stderr, "Listening & Accepting...\n");
if ((server_session_socket = accept(local_listen_socket, (struct sockaddr*)(&client_addr_info_struct), &size_of_sockaddr_in)) == -1) {
fprintf(stderr, "ERR accept():%s\n\a", strerror(errno));
exit(1);
}
fprintf(stderr, "Got connection from %s\n", inet_ntoa(client_addr_info_struct.sin_addr));
if ((read_got_bytes_nr = read(server_session_socket, buffer, 1024)) == -1) {
fprintf(stderr, "ERR read():%s\n", strerror(errno));
exit(1);
}
buffer[read_got_bytes_nr] = '\0';
printf("Server received %s\n", buffer);
close(server_session_socket);
}
close(local_listen_socket);
exit(0);
}
客户端代码
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#define portnumber 3333
int main(int argc, char* argv[]) {
int local_socket;
char buffer[1024];
struct sockaddr_in server_addr;
struct hostent* host;
if (argc != 2) {
fprintf(stderr, "Usage:%s hostname \a\n", argv[0]);
exit(1);
}
if ((host = gethostbyname(argv[1])) == NULL) {
fprintf(stderr, "ERR gethostbyname\n");
exit(1);
}
if ((local_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
fprintf(stderr, "ERR socket:%s\a\n", strerror(errno));
exit(1);
}
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(portnumber);
server_addr.sin_addr = *((struct in_addr*)host->h_addr);
if (connect(local_socket, (struct sockaddr*)(&server_addr), sizeof(struct sockaddr)) == -1) {
fprintf(stderr, "ERR connect:%s\a\n", strerror(errno));
exit(1);
}
printf("Please typein a string:\n");
fgets(buffer, 1024, stdin);
write(local_socket, buffer, strlen(buffer));
close(local_socket);
exit(0);
}
编辑并在Ubuntu运行
gcc server-while-tcp.c -o server-while-tcp
gcc client.c -o client
运行结果
修改服务器为多线程模式
服务器代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netdb.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>
#include <sys/wait.h>
#include <pthread.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_BUFFER 1024
void* thread_function(void* arg_array) {
int nr_bytes_read, char_index;
char receive_and_send_buffer[MAX_BUFFER];
int* p_arg = (int*)arg_array;
int thread_session_socket = *p_arg;
printf("thread_session_socket = %d\n", thread_session_socket);
while (1) {
nr_bytes_read = recv(thread_session_socket, receive_and_send_buffer, MAX_BUFFER, 0);
if (nr_bytes_read == -1)
break;
printf("Message from client(%d): %s\n", nr_bytes_read, receive_and_send_buffer);
char *p;
for (p = receive_and_send_buffer; *p != '\0'; p++)
*p = toupper(*p);
write(thread_session_socket, receive_and_send_buffer, MAX_BUFFER);
}
close(thread_session_socket);
return 0;
}
int main(int argc, char* argv[]) {
socklen_t size_of_client_sockaddr;
pthread_t tid;
int listen_socket;
int session_socket;
int return_code;
int port_number;
struct sockaddr_in client_remote_sockaddr;
struct sockaddr_in server_local_sockaddr;
if (argc != 2) {
printf("Usage:%s port_number \n", argv[0]);
return 1;
}
port_number = atoi(argv[1]);
listen_socket = socket(AF_INET, SOCK_STREAM, 0);
if (listen_socket == -1) {
perror("ERR socket.");
return 1;
}
memset(&server_local_sockaddr, 0, sizeof(server_local_sockaddr));
server_local_sockaddr.sin_family = AF_INET;
server_local_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
server_local_sockaddr.sin_port = htons(port_number);
return_code = bind(listen_socket, (struct sockaddr*)&server_local_sockaddr, sizeof(server_local_sockaddr));
if (return_code == -1) {
perror("ERR bind.");
close(listen_socket);
return 1;
}
return_code = listen(listen_socket, 5);
if (return_code == -1) {
perror("ERR listen.");
close(listen_socket);
return 1;
}
while (1) {
size_of_client_sockaddr = sizeof(client_remote_sockaddr);
write(STDOUT_FILENO, "Listening & Accepting for 201930310035 ...\n", strlen("Listening & Accepting for 201930310017 ...\n"));
session_socket = accept(listen_socket, (struct sockaddr*)&client_remote_sockaddr, &size_of_client_sockaddr);
if (session_socket == -1) {
if (errno == EINTR) continue;
else {
perror("ERR accept(): cannot accept client connect request");
close(session_socket);
return 1;
}
}
printf("session_socket = %d\n", session_socket);
return_code = pthread_create(&tid, NULL, thread_function, (void*)&session_socket);
if (return_code != 0) {
perror("ERR pthread_create()");
close(session_socket);
close(listen_socket);
return 1;
}
}
return 0;
}
客户端代码
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netdb.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <stdlib.h>
#define MAX_BUFFER 1024
int main(int argc, char* argv[]) {
int local_socket;
int return_code;
char send_and_receive_buffer[MAX_BUFFER];
int port_number;
int nr_bytes_read;
static struct sockaddr_in server_sockaddr;
if (argc != 3) {
printf("Usage: %s server_ip_address port_number \n", argv[0]);
return 1;
}
port_number = atoi(argv[2]);
local_socket = socket(AF_INET, SOCK_STREAM, 0);
if (local_socket == -1) {
perror("ERR socket.");
return 1;
}
memset(&server_sockaddr, 0, sizeof(server_sockaddr));
server_sockaddr.sin_family = AF_INET;
server_sockaddr.sin_addr.s_addr = inet_addr(argv[1]);
server_sockaddr.sin_port = htons(port_number);
return_code = connect(local_socket, (struct sockaddr*)&server_sockaddr, sizeof(server_sockaddr));
if (return_code == -1) {
perror("ERR connect.");
close(local_socket);
return 1;
}
memset(send_and_receive_buffer, 0, MAX_BUFFER);
while (1) {
write(STDOUT_FILENO, "Type in a string for 201930310035:", strlen("Type in a string for 201930310017:"));
nr_bytes_read = read(STDIN_FILENO, send_and_receive_buffer, MAX_BUFFER);
if (nr_bytes_read > 0)
write(local_socket, send_and_receive_buffer, MAX_BUFFER);
nr_bytes_read = read(local_socket, send_and_receive_buffer, MAX_BUFFER);
if (nr_bytes_read > 0)
printf("Message form server: %s\n", send_and_receive_buffer);
if (send_and_receive_buffer[0] == '#')
break;
}
close(local_socket);
return 0;
}
编译后运行结果