Error[8]: Undefined offset: 738, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

查看while源代码 服务器代码
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include 
#include  

#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];


	/* socket: 服务器端开始建立sockfd描述符 */
	if ((local_listen_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1) { // AF_INET i.e. IPV4; SOCK_STREAM i.e. TCP
		fprintf(stderr, "Socket error:%s\n\a", strerror(errno));
		exit(1);
	}

	/* 准备 sockaddr结构及其内部IP、端口信息 */
	bzero(&server_addr_info_struct, sizeof(struct sockaddr_in)); // 初始化,置0
	server_addr_info_struct.sin_family = AF_INET;                 // Internet
	server_addr_info_struct.sin_addr.s_addr = htonl(INADDR_ANY);  // 将本机host上的long数据转化为网络上的long数据,使服务器程序能运行在不同CPU的主机上 
													// INADDR_ANY 表示主机监听任意/所有IP地址。
	//server_addr_info_struct.sin_addr.s_addr=inet_addr("192.168.1.1");  //用于绑定到一个固定IP,inet_addr用于把数字加格式的ip转化为整形ip
	server_addr_info_struct.sin_port = htons(portnumber);         // (将本机器上的short数据转化为网络上的short数据)端口号

	/* bind: 绑定sockfd描述符 和 IP、端口 */
	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] = '('\n
		printf)"Server received %s;", buffer() /* 这个对话服务已经结束 */
		close;server_session_socket}( /* 下一个 */
	)

	/* 结束通讯 */
	close;local_listen_socket(0
	exit);}#include  
#define portnumber 3333
客户端代码
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include 
(

[

int main]int argc, char* argv);[ {
	int local_socket1024
	char buffer];;host
	struct sockaddr_in server_addr;
	struct hostent* if(

	!= 2argc ) (\a {
		fprintf\nstderr, "Usage:%s hostname [0", argv]);(1
		exit);}if
	((

	/* 使用hostname查询host 名字 */
	= (host 1 gethostbyname))argv[==]) ( NULL\n {
		fprintf)stderr, "ERR gethostbyname;"(1
		exit);}if
	((

	/* 客户程序开始建立 local_socket描述符 */
	= (local_socket , socket,AF_INET0 SOCK_STREAM)) ==) ; -1( { // AF_INET:Internet\aSOCK_STREAM:TCP
		fprintf\nstderr, "ERR socket:%s())", strerror;errno(1
		exit);}(
	&

	/* 客户程序填充服务端的资料 */
	bzero())server_addr, sizeof;server_addr=; // 初始化,置0
	server_addr.sin_family = AF_INET(          // IPV4
	server_addr.sin_port ) htons;portnumber()  // =将本机器上的short数据转化为网络上的short数据((端口号
	server_addr.sin_addr * *)struct in_addr-)host;>h_addr// /* IP地址

	*/ 客户程序发起连接请求 ((
	if ,connect(local_socket* )struct sockaddr(&),server_addr()) sizeof==struct sockaddr) ( -1\a {
		fprintf\nstderr, "ERR connect:%s())", strerror;errno(1
		exit);}(
	\n

	/* 连接成功了 */
	printf)"Please typein a string:;"(1024

	/* 读取和发送数据 */
	fgets)buffer, ;, stdin((
	write))local_socket, buffer, strlen;buffer()
	
	/* 结束通讯 */
	close;local_socket(0
	exit);}gcc server-while-tcp.c -o server-while-tcp
gcc client.c -o client

#include 
编译并在Ubuntu运行
#define MAX_BUFFER 1024
运行结果

服务器

客户端

修改服务器为多线程模式 服务器代码
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
(
#include 
#include 
//TODO: 某些头文件
)

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\n
    printf)"thread_session_socket = %d;", thread_session_socketwhile(
    1 )=( {
        nr_bytes_read 0 recv)thread_session_socket, receive_and_send_buffer, MAX_BUFFER, ;if(//TODO: 尝试从socket读取
        == )nr_bytes_read break -1;//TODO: 如果错误,或没能从socket读取字符
            (\n
        printf)"Message from client(%d): %s;", nr_bytes_read, receive_and_send_buffer;for
	char *p(	
	= ;p != receive_and_send_buffer) *p = '(') p++;
		*p ( toupper)*p;}        
	//TODO: 转换为大写
        write(thread_session_socket, receive_and_send_buffer, MAX_BUFFER); //TODO: 返回给客户端
    return
    close0thread_session_socket;}//TODO: 关闭socket
    ( []
)

int main;int argc, char* argv;;; {
    socklen_t size_of_client_sockaddr;
    pthread_t tid;
    int listen_socket;
    int session_socket;
    int return_codeif
    int port_number(

    struct sockaddr_in client_remote_sockaddr!=
    struct sockaddr_in server_local_sockaddr2

    //服务器端运行时要给出端口信息,该端口为监听端口 
    ) (argc \n [0 {
        printf]"Usage:%s port_number )", argv;return1;}
        = ([
    1

    //获得输入的端口 
    port_number ] atoi)argv;=(0)

    //创建套接字用于服务器的监听 
    listen_socket ; socket(AF_INET, SOCK_STREAM, )if(//TODO: socket==)
    ( "ERR socket."listen_socket ) -1; {//TODO: 如果出错
        perrorreturn1;}
        ( &0
    (

    //填充关于服务器的套节字信息
    memset));server_local_sockaddr, =, 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*;ifserver_local_sockaddr, sizeof(server_local_sockaddr==)//TODO: 调用bind绑定地址和端口(提供服务的位置)
    ( "ERR bind."return_code ) -1; {//TODO: 如果出错
        perror();return
        close1listen_socket;}//TODO: 关闭监听socket
        = (5
    )

    //监听指定端口,连接5个客户端 
    return_code ; listeniflisten_socket, (==)//TODO: 请求监听、提供服务
    ( "ERR listen."return_code ) -1; {//TODO: 如果出错
        perror();return
        close1listen_socket;}//TODO: 关闭监听socket
        #退出。 while(
    1

    //对每个连接来的客户端创建一个线程,单独与其进行通信。
    //首先调用read函数读取客户端发送来的信息,将其转换成大写后发送回客户端,)
    = (); {
        size_of_client_sockaddr 12345 sizeof(client_remote_sockaddr\n(
        //TODO: \n 改为自己的学号,此处不要修改write调用和STDOUT_FILENO参数!
        write))STDOUT_FILENO, "Listening & Accepting for 201930310035 ...;", strlen="Listening & Accepting for 201930310035 ...("()    
	session_socket & accept&listen_socket, )struct sockaddr*;ifclient_remote_sockaddr, (size_of_client_sockaddr==)//TODO: 调用accept阻塞,接到客户机时返回 session_socket
        if (session_socket == -1) {//TODO: 如果出错
            continue ;errno else EINTR( "ERR accept(): cannot accept client connect request")
            ; {
                perror();return
                close1session_socket;}//TODO: 关闭socket
                } (\n
            )
        ;
        printf="session_socket = %d(", session_socket&( //打印建立连接的客户端产生的套节字
        return_code ) pthread_create&)tid, NULL, thread_function, ;void*if(session_socket!=0//TODO: 调用 pthread_create,将 session_socket传递给 thread_function
        ) (return_code "ERR pthread_create()" ); {//TODO: 如果出错
            perror();(
            close)session_socket;return//TODO: 关闭一个socket
            close1listen_socket;}//TODO: 关闭另一个socket
            } return0
        ;
    }
    #include  #define MAX_BUFFER 1024(
[
客户端代码
#include 
#include 
#include 
#include 
#include 
#include 
]
#include 
//TODO: 某些头文件
)

int main;int argc, char* argv;[] {
    int  local_socket;
    int  return_code;
    char send_and_receive_buffer;MAX_BUFFER;if
    int  port_number(
    int  nr_bytes_read!=

    static struct sockaddr_in server_sockaddr3

    //客户端运行需要给出具体的连接地址和端口 
    ) (argc \n [0 {
        printf]"Usage: %s server_ip_address port_number )", argv;return1;}
        = ([
    2

    //获得输入的端口
    port_number ] atoi)argv;=(0)

    //创建套节字用于客户端的连接
    local_socket ; socketifAF_INET, SOCK_STREAM, (==)//TODO: 调用socket
    ( "ERR socket."local_socket ) -1; {//TODO: 如果错误
        perrorreturn1;}
        ( &0
    (

    //填充关于服务器的套节字信息
    memset));server_sockaddr, =, sizeof;server_sockaddr=(
    server_sockaddr.sin_family [ AF_INET1
    server_sockaddr.sin_addr.s_addr ] inet_addr)argv;=();
    server_sockaddr.sin_port = htons(port_number()

    //连接指定的服务器 
    return_code & connect(local_socket, ))struct sockaddr*;ifserver_sockaddr, sizeof(server_sockaddr==)//TODO: 调用connect
    ( "ERR connect."return_code ) -1; {//TODO: 如果错误
        perror();return
        close1local_socket;}
        ( 0)
    ;

    memset#”退出 send_and_receive_buffer, while, MAX_BUFFER(1
    //用户输入信息后,程序将输入的信息通过套接字发送给服务器 ,然后调用read函数从服务器中读取发送来的信息。
    //输入“)
    12345 ("Type in a string for 201930310035:"( {
        //TODO: "Type in a string for 201930310035:" 改为自己的学号,此处不要修改write调用和STDOUT_FILENO参数!
        write))STDOUT_FILENO, ;, strlen=();
        nr_bytes_read if read(STDIN_FILENO, send_and_receive_buffer, MAX_BUFFER0)//TODO: 调用read, 从STDIN_FILENO读
        ( )nr_bytes_read > ;=
            write(local_socket, send_and_receive_buffer, MAX_BUFFER);//TODO: 调用write,写socket
        nr_bytes_read if read(local_socket, send_and_receive_buffer, MAX_BUFFER0)//TODO: 调用read,读socket
        ( \nnr_bytes_read > );
            printfif"Message form server: %s(", send_and_receive_buffer[0
        ] ==send_and_receive_buffer'#')break ; }(
            );
    return
    close0local_socket;}
    [+++] [+++][+++]
[+++]
编译后运行结果

服务器

客户端

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 739, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

查看while源代码 服务器代码
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include 
#include  

#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];


	/* socket: 服务器端开始建立sockfd描述符 */
	if ((local_listen_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1) { // AF_INET i.e. IPV4; SOCK_STREAM i.e. TCP
		fprintf(stderr, "Socket error:%s\n\a", strerror(errno));
		exit(1);
	}

	/* 准备 sockaddr结构及其内部IP、端口信息 */
	bzero(&server_addr_info_struct, sizeof(struct sockaddr_in)); // 初始化,置0
	server_addr_info_struct.sin_family = AF_INET;                 // Internet
	server_addr_info_struct.sin_addr.s_addr = htonl(INADDR_ANY);  // 将本机host上的long数据转化为网络上的long数据,使服务器程序能运行在不同CPU的主机上 
													// INADDR_ANY 表示主机监听任意/所有IP地址。
	//server_addr_info_struct.sin_addr.s_addr=inet_addr("192.168.1.1");  //用于绑定到一个固定IP,inet_addr用于把数字加格式的ip转化为整形ip
	server_addr_info_struct.sin_port = htons(portnumber);         // (将本机器上的short数据转化为网络上的short数据)端口号

	/* bind: 绑定sockfd描述符 和 IP、端口 */
	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] = '('\n
		printf)"Server received %s;", buffer() /* 这个对话服务已经结束 */
		close;server_session_socket}( /* 下一个 */
	)

	/* 结束通讯 */
	close;local_listen_socket(0
	exit);}#include  
#define portnumber 3333
客户端代码
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include 
(

[

int main]int argc, char* argv);[ {
	int local_socket1024
	char buffer];;host
	struct sockaddr_in server_addr;
	struct hostent* if(

	!= 2argc ) (\a {
		fprintf\nstderr, "Usage:%s hostname [0", argv]);(1
		exit);}if
	((

	/* 使用hostname查询host 名字 */
	= (host 1 gethostbyname))argv[==]) ( NULL\n {
		fprintf)stderr, "ERR gethostbyname;"(1
		exit);}if
	((

	/* 客户程序开始建立 local_socket描述符 */
	= (local_socket , socket,AF_INET0 SOCK_STREAM)) ==) ; -1( { // AF_INET:Internet\aSOCK_STREAM:TCP
		fprintf\nstderr, "ERR socket:%s())", strerror;errno(1
		exit);}(
	&

	/* 客户程序填充服务端的资料 */
	bzero())server_addr, sizeof;server_addr=; // 初始化,置0
	server_addr.sin_family = AF_INET(          // IPV4
	server_addr.sin_port ) htons;portnumber()  // =将本机器上的short数据转化为网络上的short数据((端口号
	server_addr.sin_addr * *)struct in_addr-)host;>h_addr// /* IP地址

	*/ 客户程序发起连接请求 ((
	if ,connect(local_socket* )struct sockaddr(&),server_addr()) sizeof==struct sockaddr) ( -1\a {
		fprintf\nstderr, "ERR connect:%s())", strerror;errno(1
		exit);}(
	\n

	/* 连接成功了 */
	printf)"Please typein a string:;"(1024

	/* 读取和发送数据 */
	fgets)buffer, ;, stdin((
	write))local_socket, buffer, strlen;buffer()
	
	/* 结束通讯 */
	close;local_socket(0
	exit);}gcc server-while-tcp.c -o server-while-tcp
gcc client.c -o client

#include 
编译并在Ubuntu运行
#define MAX_BUFFER 1024
运行结果

服务器

客户端

修改服务器为多线程模式 服务器代码
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
(
#include 
#include 
//TODO: 某些头文件
)

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\n
    printf)"thread_session_socket = %d;", thread_session_socketwhile(
    1 )=( {
        nr_bytes_read 0 recv)thread_session_socket, receive_and_send_buffer, MAX_BUFFER, ;if(//TODO: 尝试从socket读取
        == )nr_bytes_read break -1;//TODO: 如果错误,或没能从socket读取字符
            (\n
        printf)"Message from client(%d): %s;", nr_bytes_read, receive_and_send_buffer;for
	char *p(	
	= ;p != receive_and_send_buffer) *p = '(') p++;
		*p ( toupper)*p;}        
	//TODO: 转换为大写
        write(thread_session_socket, receive_and_send_buffer, MAX_BUFFER); //TODO: 返回给客户端
    return
    close0thread_session_socket;}//TODO: 关闭socket
    ( []
)

int main;int argc, char* argv;;; {
    socklen_t size_of_client_sockaddr;
    pthread_t tid;
    int listen_socket;
    int session_socket;
    int return_codeif
    int port_number(

    struct sockaddr_in client_remote_sockaddr!=
    struct sockaddr_in server_local_sockaddr2

    //服务器端运行时要给出端口信息,该端口为监听端口 
    ) (argc \n [0 {
        printf]"Usage:%s port_number )", argv;return1;}
        = ([
    1

    //获得输入的端口 
    port_number ] atoi)argv;=(0)

    //创建套接字用于服务器的监听 
    listen_socket ; socket(AF_INET, SOCK_STREAM, )if(//TODO: socket==)
    ( "ERR socket."listen_socket ) -1; {//TODO: 如果出错
        perrorreturn1;}
        ( &0
    (

    //填充关于服务器的套节字信息
    memset));server_local_sockaddr, =, 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*;ifserver_local_sockaddr, sizeof(server_local_sockaddr==)//TODO: 调用bind绑定地址和端口(提供服务的位置)
    ( "ERR bind."return_code ) -1; {//TODO: 如果出错
        perror();return
        close1listen_socket;}//TODO: 关闭监听socket
        = (5
    )

    //监听指定端口,连接5个客户端 
    return_code ; listeniflisten_socket, (==)//TODO: 请求监听、提供服务
    ( "ERR listen."return_code ) -1; {//TODO: 如果出错
        perror();return
        close1listen_socket;}//TODO: 关闭监听socket
        #退出。 while(
    1

    //对每个连接来的客户端创建一个线程,单独与其进行通信。
    //首先调用read函数读取客户端发送来的信息,将其转换成大写后发送回客户端,)
    = (); {
        size_of_client_sockaddr 12345 sizeof(client_remote_sockaddr\n(
        //TODO: \n 改为自己的学号,此处不要修改write调用和STDOUT_FILENO参数!
        write))STDOUT_FILENO, "Listening & Accepting for 201930310035 ...;", strlen="Listening & Accepting for 201930310035 ...("()    
	session_socket & accept&listen_socket, )struct sockaddr*;ifclient_remote_sockaddr, (size_of_client_sockaddr==)//TODO: 调用accept阻塞,接到客户机时返回 session_socket
        if (session_socket == -1) {//TODO: 如果出错
            continue ;errno else EINTR( "ERR accept(): cannot accept client connect request")
            ; {
                perror();return
                close1session_socket;}//TODO: 关闭socket
                } (\n
            )
        ;
        printf="session_socket = %d(", session_socket&( //打印建立连接的客户端产生的套节字
        return_code ) pthread_create&)tid, NULL, thread_function, ;void*if(session_socket!=0//TODO: 调用 pthread_create,将 session_socket传递给 thread_function
        ) (return_code "ERR pthread_create()" ); {//TODO: 如果出错
            perror();(
            close)session_socket;return//TODO: 关闭一个socket
            close1listen_socket;}//TODO: 关闭另一个socket
            } return0
        ;
    }
    #include  #define MAX_BUFFER 1024(
[
客户端代码
#include 
#include 
#include 
#include 
#include 
#include 
]
#include 
//TODO: 某些头文件
)

int main;int argc, char* argv;[] {
    int  local_socket;
    int  return_code;
    char send_and_receive_buffer;MAX_BUFFER;if
    int  port_number(
    int  nr_bytes_read!=

    static struct sockaddr_in server_sockaddr3

    //客户端运行需要给出具体的连接地址和端口 
    ) (argc \n [0 {
        printf]"Usage: %s server_ip_address port_number )", argv;return1;}
        = ([
    2

    //获得输入的端口
    port_number ] atoi)argv;=(0)

    //创建套节字用于客户端的连接
    local_socket ; socketifAF_INET, SOCK_STREAM, (==)//TODO: 调用socket
    ( "ERR socket."local_socket ) -1; {//TODO: 如果错误
        perrorreturn1;}
        ( &0
    (

    //填充关于服务器的套节字信息
    memset));server_sockaddr, =, sizeof;server_sockaddr=(
    server_sockaddr.sin_family [ AF_INET1
    server_sockaddr.sin_addr.s_addr ] inet_addr)argv;=();
    server_sockaddr.sin_port = htons(port_number()

    //连接指定的服务器 
    return_code & connect(local_socket, ))struct sockaddr*;ifserver_sockaddr, sizeof(server_sockaddr==)//TODO: 调用connect
    ( "ERR connect."return_code ) -1; {//TODO: 如果错误
        perror();return
        close1local_socket;}
        ( 0)
    ;

    memset#”退出 send_and_receive_buffer, while, MAX_BUFFER(1
    //用户输入信息后,程序将输入的信息通过套接字发送给服务器 ,然后调用read函数从服务器中读取发送来的信息。
    //输入“)
    12345 ("Type in a string for 201930310035:"( {
        //TODO: "Type in a string for 201930310035:" 改为自己的学号,此处不要修改write调用和STDOUT_FILENO参数!
        write))STDOUT_FILENO, ;, strlen=();
        nr_bytes_read if read(STDIN_FILENO, send_and_receive_buffer, MAX_BUFFER0)//TODO: 调用read, 从STDIN_FILENO读
        ( )nr_bytes_read > ;=
            write(local_socket, send_and_receive_buffer, MAX_BUFFER);//TODO: 调用write,写socket
        nr_bytes_read if read(local_socket, send_and_receive_buffer, MAX_BUFFER0)//TODO: 调用read,读socket
        ( \nnr_bytes_read > );
            printfif"Message form server: %s(", send_and_receive_buffer[0
        ] ==send_and_receive_buffer'#')break ; }(
            );
    return
    close0local_socket;}
     [+++][+++]
[+++]
编译后运行结果

服务器

客户端

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 740, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

查看while源代码 服务器代码
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include 
#include  

#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];


	/* socket: 服务器端开始建立sockfd描述符 */
	if ((local_listen_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1) { // AF_INET i.e. IPV4; SOCK_STREAM i.e. TCP
		fprintf(stderr, "Socket error:%s\n\a", strerror(errno));
		exit(1);
	}

	/* 准备 sockaddr结构及其内部IP、端口信息 */
	bzero(&server_addr_info_struct, sizeof(struct sockaddr_in)); // 初始化,置0
	server_addr_info_struct.sin_family = AF_INET;                 // Internet
	server_addr_info_struct.sin_addr.s_addr = htonl(INADDR_ANY);  // 将本机host上的long数据转化为网络上的long数据,使服务器程序能运行在不同CPU的主机上 
													// INADDR_ANY 表示主机监听任意/所有IP地址。
	//server_addr_info_struct.sin_addr.s_addr=inet_addr("192.168.1.1");  //用于绑定到一个固定IP,inet_addr用于把数字加格式的ip转化为整形ip
	server_addr_info_struct.sin_port = htons(portnumber);         // (将本机器上的short数据转化为网络上的short数据)端口号

	/* bind: 绑定sockfd描述符 和 IP、端口 */
	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] = '('\n
		printf)"Server received %s;", buffer() /* 这个对话服务已经结束 */
		close;server_session_socket}( /* 下一个 */
	)

	/* 结束通讯 */
	close;local_listen_socket(0
	exit);}#include  
#define portnumber 3333
客户端代码
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include 
(

[

int main]int argc, char* argv);[ {
	int local_socket1024
	char buffer];;host
	struct sockaddr_in server_addr;
	struct hostent* if(

	!= 2argc ) (\a {
		fprintf\nstderr, "Usage:%s hostname [0", argv]);(1
		exit);}if
	((

	/* 使用hostname查询host 名字 */
	= (host 1 gethostbyname))argv[==]) ( NULL\n {
		fprintf)stderr, "ERR gethostbyname;"(1
		exit);}if
	((

	/* 客户程序开始建立 local_socket描述符 */
	= (local_socket , socket,AF_INET0 SOCK_STREAM)) ==) ; -1( { // AF_INET:Internet\aSOCK_STREAM:TCP
		fprintf\nstderr, "ERR socket:%s())", strerror;errno(1
		exit);}(
	&

	/* 客户程序填充服务端的资料 */
	bzero())server_addr, sizeof;server_addr=; // 初始化,置0
	server_addr.sin_family = AF_INET(          // IPV4
	server_addr.sin_port ) htons;portnumber()  // =将本机器上的short数据转化为网络上的short数据((端口号
	server_addr.sin_addr * *)struct in_addr-)host;>h_addr// /* IP地址

	*/ 客户程序发起连接请求 ((
	if ,connect(local_socket* )struct sockaddr(&),server_addr()) sizeof==struct sockaddr) ( -1\a {
		fprintf\nstderr, "ERR connect:%s())", strerror;errno(1
		exit);}(
	\n

	/* 连接成功了 */
	printf)"Please typein a string:;"(1024

	/* 读取和发送数据 */
	fgets)buffer, ;, stdin((
	write))local_socket, buffer, strlen;buffer()
	
	/* 结束通讯 */
	close;local_socket(0
	exit);}gcc server-while-tcp.c -o server-while-tcp
gcc client.c -o client

#include 
编译并在Ubuntu运行
#define MAX_BUFFER 1024
运行结果

服务器

客户端

修改服务器为多线程模式 服务器代码
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
(
#include 
#include 
//TODO: 某些头文件
)

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\n
    printf)"thread_session_socket = %d;", thread_session_socketwhile(
    1 )=( {
        nr_bytes_read 0 recv)thread_session_socket, receive_and_send_buffer, MAX_BUFFER, ;if(//TODO: 尝试从socket读取
        == )nr_bytes_read break -1;//TODO: 如果错误,或没能从socket读取字符
            (\n
        printf)"Message from client(%d): %s;", nr_bytes_read, receive_and_send_buffer;for
	char *p(	
	= ;p != receive_and_send_buffer) *p = '(') p++;
		*p ( toupper)*p;}        
	//TODO: 转换为大写
        write(thread_session_socket, receive_and_send_buffer, MAX_BUFFER); //TODO: 返回给客户端
    return
    close0thread_session_socket;}//TODO: 关闭socket
    ( []
)

int main;int argc, char* argv;;; {
    socklen_t size_of_client_sockaddr;
    pthread_t tid;
    int listen_socket;
    int session_socket;
    int return_codeif
    int port_number(

    struct sockaddr_in client_remote_sockaddr!=
    struct sockaddr_in server_local_sockaddr2

    //服务器端运行时要给出端口信息,该端口为监听端口 
    ) (argc \n [0 {
        printf]"Usage:%s port_number )", argv;return1;}
        = ([
    1

    //获得输入的端口 
    port_number ] atoi)argv;=(0)

    //创建套接字用于服务器的监听 
    listen_socket ; socket(AF_INET, SOCK_STREAM, )if(//TODO: socket==)
    ( "ERR socket."listen_socket ) -1; {//TODO: 如果出错
        perrorreturn1;}
        ( &0
    (

    //填充关于服务器的套节字信息
    memset));server_local_sockaddr, =, 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*;ifserver_local_sockaddr, sizeof(server_local_sockaddr==)//TODO: 调用bind绑定地址和端口(提供服务的位置)
    ( "ERR bind."return_code ) -1; {//TODO: 如果出错
        perror();return
        close1listen_socket;}//TODO: 关闭监听socket
        = (5
    )

    //监听指定端口,连接5个客户端 
    return_code ; listeniflisten_socket, (==)//TODO: 请求监听、提供服务
    ( "ERR listen."return_code ) -1; {//TODO: 如果出错
        perror();return
        close1listen_socket;}//TODO: 关闭监听socket
        #退出。 while(
    1

    //对每个连接来的客户端创建一个线程,单独与其进行通信。
    //首先调用read函数读取客户端发送来的信息,将其转换成大写后发送回客户端,)
    = (); {
        size_of_client_sockaddr 12345 sizeof(client_remote_sockaddr\n(
        //TODO: \n 改为自己的学号,此处不要修改write调用和STDOUT_FILENO参数!
        write))STDOUT_FILENO, "Listening & Accepting for 201930310035 ...;", strlen="Listening & Accepting for 201930310035 ...("()    
	session_socket & accept&listen_socket, )struct sockaddr*;ifclient_remote_sockaddr, (size_of_client_sockaddr==)//TODO: 调用accept阻塞,接到客户机时返回 session_socket
        if (session_socket == -1) {//TODO: 如果出错
            continue ;errno else EINTR( "ERR accept(): cannot accept client connect request")
            ; {
                perror();return
                close1session_socket;}//TODO: 关闭socket
                } (\n
            )
        ;
        printf="session_socket = %d(", session_socket&( //打印建立连接的客户端产生的套节字
        return_code ) pthread_create&)tid, NULL, thread_function, ;void*if(session_socket!=0//TODO: 调用 pthread_create,将 session_socket传递给 thread_function
        ) (return_code "ERR pthread_create()" ); {//TODO: 如果出错
            perror();(
            close)session_socket;return//TODO: 关闭一个socket
            close1listen_socket;}//TODO: 关闭另一个socket
            } return0
        ;
    }
    #include  #define MAX_BUFFER 1024(
[
客户端代码
#include 
#include 
#include 
#include 
#include 
#include 
]
#include 
//TODO: 某些头文件
)

int main;int argc, char* argv;[] {
    int  local_socket;
    int  return_code;
    char send_and_receive_buffer;MAX_BUFFER;if
    int  port_number(
    int  nr_bytes_read!=

    static struct sockaddr_in server_sockaddr3

    //客户端运行需要给出具体的连接地址和端口 
    ) (argc \n [0 {
        printf]"Usage: %s server_ip_address port_number )", argv;return1;}
        = ([
    2

    //获得输入的端口
    port_number ] atoi)argv;=(0)

    //创建套节字用于客户端的连接
    local_socket ; socketifAF_INET, SOCK_STREAM, (==)//TODO: 调用socket
    ( "ERR socket."local_socket ) -1; {//TODO: 如果错误
        perrorreturn1;}
        ( &0
    (

    //填充关于服务器的套节字信息
    memset));server_sockaddr, =, sizeof;server_sockaddr=(
    server_sockaddr.sin_family [ AF_INET1
    server_sockaddr.sin_addr.s_addr ] inet_addr)argv;=();
    server_sockaddr.sin_port = htons(port_number()

    //连接指定的服务器 
    return_code & connect(local_socket, ))struct sockaddr*;ifserver_sockaddr, sizeof(server_sockaddr==)//TODO: 调用connect
    ( "ERR connect."return_code ) -1; {//TODO: 如果错误
        perror();return
        close1local_socket;}
        ( 0)
    ;

    memset#”退出 send_and_receive_buffer, while, MAX_BUFFER(1
    //用户输入信息后,程序将输入的信息通过套接字发送给服务器 ,然后调用read函数从服务器中读取发送来的信息。
    //输入“)
    12345 ("Type in a string for 201930310035:"( {
        //TODO: "Type in a string for 201930310035:" 改为自己的学号,此处不要修改write调用和STDOUT_FILENO参数!
        write))STDOUT_FILENO, ;, strlen=();
        nr_bytes_read if read(STDIN_FILENO, send_and_receive_buffer, MAX_BUFFER0)//TODO: 调用read, 从STDIN_FILENO读
        ( )nr_bytes_read > ;=
            write(local_socket, send_and_receive_buffer, MAX_BUFFER);//TODO: 调用write,写socket
        nr_bytes_read if read(local_socket, send_and_receive_buffer, MAX_BUFFER0)//TODO: 调用read,读socket
        ( \nnr_bytes_read > );
            printfif"Message form server: %s(", send_and_receive_buffer[0
        ] ==send_and_receive_buffer'#')break ; }(
            );
    return
    close0local_socket;}
     [+++]
[+++]
编译后运行结果

服务器

客户端

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Undefined offset: 741, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

查看while源代码 服务器代码
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include 
#include  

#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];


	/* socket: 服务器端开始建立sockfd描述符 */
	if ((local_listen_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1) { // AF_INET i.e. IPV4; SOCK_STREAM i.e. TCP
		fprintf(stderr, "Socket error:%s\n\a", strerror(errno));
		exit(1);
	}

	/* 准备 sockaddr结构及其内部IP、端口信息 */
	bzero(&server_addr_info_struct, sizeof(struct sockaddr_in)); // 初始化,置0
	server_addr_info_struct.sin_family = AF_INET;                 // Internet
	server_addr_info_struct.sin_addr.s_addr = htonl(INADDR_ANY);  // 将本机host上的long数据转化为网络上的long数据,使服务器程序能运行在不同CPU的主机上 
													// INADDR_ANY 表示主机监听任意/所有IP地址。
	//server_addr_info_struct.sin_addr.s_addr=inet_addr("192.168.1.1");  //用于绑定到一个固定IP,inet_addr用于把数字加格式的ip转化为整形ip
	server_addr_info_struct.sin_port = htons(portnumber);         // (将本机器上的short数据转化为网络上的short数据)端口号

	/* bind: 绑定sockfd描述符 和 IP、端口 */
	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] = '('\n
		printf)"Server received %s;", buffer() /* 这个对话服务已经结束 */
		close;server_session_socket}( /* 下一个 */
	)

	/* 结束通讯 */
	close;local_listen_socket(0
	exit);}#include  
#define portnumber 3333
客户端代码
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include 
(

[

int main]int argc, char* argv);[ {
	int local_socket1024
	char buffer];;host
	struct sockaddr_in server_addr;
	struct hostent* if(

	!= 2argc ) (\a {
		fprintf\nstderr, "Usage:%s hostname [0", argv]);(1
		exit);}if
	((

	/* 使用hostname查询host 名字 */
	= (host 1 gethostbyname))argv[==]) ( NULL\n {
		fprintf)stderr, "ERR gethostbyname;"(1
		exit);}if
	((

	/* 客户程序开始建立 local_socket描述符 */
	= (local_socket , socket,AF_INET0 SOCK_STREAM)) ==) ; -1( { // AF_INET:Internet\aSOCK_STREAM:TCP
		fprintf\nstderr, "ERR socket:%s())", strerror;errno(1
		exit);}(
	&

	/* 客户程序填充服务端的资料 */
	bzero())server_addr, sizeof;server_addr=; // 初始化,置0
	server_addr.sin_family = AF_INET(          // IPV4
	server_addr.sin_port ) htons;portnumber()  // =将本机器上的short数据转化为网络上的short数据((端口号
	server_addr.sin_addr * *)struct in_addr-)host;>h_addr// /* IP地址

	*/ 客户程序发起连接请求 ((
	if ,connect(local_socket* )struct sockaddr(&),server_addr()) sizeof==struct sockaddr) ( -1\a {
		fprintf\nstderr, "ERR connect:%s())", strerror;errno(1
		exit);}(
	\n

	/* 连接成功了 */
	printf)"Please typein a string:;"(1024

	/* 读取和发送数据 */
	fgets)buffer, ;, stdin((
	write))local_socket, buffer, strlen;buffer()
	
	/* 结束通讯 */
	close;local_socket(0
	exit);}gcc server-while-tcp.c -o server-while-tcp
gcc client.c -o client

#include 
编译并在Ubuntu运行
#define MAX_BUFFER 1024
运行结果

服务器

客户端

修改服务器为多线程模式 服务器代码
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
(
#include 
#include 
//TODO: 某些头文件
)

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\n
    printf)"thread_session_socket = %d;", thread_session_socketwhile(
    1 )=( {
        nr_bytes_read 0 recv)thread_session_socket, receive_and_send_buffer, MAX_BUFFER, ;if(//TODO: 尝试从socket读取
        == )nr_bytes_read break -1;//TODO: 如果错误,或没能从socket读取字符
            (\n
        printf)"Message from client(%d): %s;", nr_bytes_read, receive_and_send_buffer;for
	char *p(	
	= ;p != receive_and_send_buffer) *p = '(') p++;
		*p ( toupper)*p;}        
	//TODO: 转换为大写
        write(thread_session_socket, receive_and_send_buffer, MAX_BUFFER); //TODO: 返回给客户端
    return
    close0thread_session_socket;}//TODO: 关闭socket
    ( []
)

int main;int argc, char* argv;;; {
    socklen_t size_of_client_sockaddr;
    pthread_t tid;
    int listen_socket;
    int session_socket;
    int return_codeif
    int port_number(

    struct sockaddr_in client_remote_sockaddr!=
    struct sockaddr_in server_local_sockaddr2

    //服务器端运行时要给出端口信息,该端口为监听端口 
    ) (argc \n [0 {
        printf]"Usage:%s port_number )", argv;return1;}
        = ([
    1

    //获得输入的端口 
    port_number ] atoi)argv;=(0)

    //创建套接字用于服务器的监听 
    listen_socket ; socket(AF_INET, SOCK_STREAM, )if(//TODO: socket==)
    ( "ERR socket."listen_socket ) -1; {//TODO: 如果出错
        perrorreturn1;}
        ( &0
    (

    //填充关于服务器的套节字信息
    memset));server_local_sockaddr, =, 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*;ifserver_local_sockaddr, sizeof(server_local_sockaddr==)//TODO: 调用bind绑定地址和端口(提供服务的位置)
    ( "ERR bind."return_code ) -1; {//TODO: 如果出错
        perror();return
        close1listen_socket;}//TODO: 关闭监听socket
        = (5
    )

    //监听指定端口,连接5个客户端 
    return_code ; listeniflisten_socket, (==)//TODO: 请求监听、提供服务
    ( "ERR listen."return_code ) -1; {//TODO: 如果出错
        perror();return
        close1listen_socket;}//TODO: 关闭监听socket
        #退出。 while(
    1

    //对每个连接来的客户端创建一个线程,单独与其进行通信。
    //首先调用read函数读取客户端发送来的信息,将其转换成大写后发送回客户端,)
    = (); {
        size_of_client_sockaddr 12345 sizeof(client_remote_sockaddr\n(
        //TODO: \n 改为自己的学号,此处不要修改write调用和STDOUT_FILENO参数!
        write))STDOUT_FILENO, "Listening & Accepting for 201930310035 ...;", strlen="Listening & Accepting for 201930310035 ...("()    
	session_socket & accept&listen_socket, )struct sockaddr*;ifclient_remote_sockaddr, (size_of_client_sockaddr==)//TODO: 调用accept阻塞,接到客户机时返回 session_socket
        if (session_socket == -1) {//TODO: 如果出错
            continue ;errno else EINTR( "ERR accept(): cannot accept client connect request")
            ; {
                perror();return
                close1session_socket;}//TODO: 关闭socket
                } (\n
            )
        ;
        printf="session_socket = %d(", session_socket&( //打印建立连接的客户端产生的套节字
        return_code ) pthread_create&)tid, NULL, thread_function, ;void*if(session_socket!=0//TODO: 调用 pthread_create,将 session_socket传递给 thread_function
        ) (return_code "ERR pthread_create()" ); {//TODO: 如果出错
            perror();(
            close)session_socket;return//TODO: 关闭一个socket
            close1listen_socket;}//TODO: 关闭另一个socket
            } return0
        ;
    }
    #include  #define MAX_BUFFER 1024(
[
客户端代码
#include 
#include 
#include 
#include 
#include 
#include 
]
#include 
//TODO: 某些头文件
)

int main;int argc, char* argv;[] {
    int  local_socket;
    int  return_code;
    char send_and_receive_buffer;MAX_BUFFER;if
    int  port_number(
    int  nr_bytes_read!=

    static struct sockaddr_in server_sockaddr3

    //客户端运行需要给出具体的连接地址和端口 
    ) (argc \n [0 {
        printf]"Usage: %s server_ip_address port_number )", argv;return1;}
        = ([
    2

    //获得输入的端口
    port_number ] atoi)argv;=(0)

    //创建套节字用于客户端的连接
    local_socket ; socketifAF_INET, SOCK_STREAM, (==)//TODO: 调用socket
    ( "ERR socket."local_socket ) -1; {//TODO: 如果错误
        perrorreturn1;}
        ( &0
    (

    //填充关于服务器的套节字信息
    memset));server_sockaddr, =, sizeof;server_sockaddr=(
    server_sockaddr.sin_family [ AF_INET1
    server_sockaddr.sin_addr.s_addr ] inet_addr)argv;=();
    server_sockaddr.sin_port = htons(port_number()

    //连接指定的服务器 
    return_code & connect(local_socket, ))struct sockaddr*;ifserver_sockaddr, sizeof(server_sockaddr==)//TODO: 调用connect
    ( "ERR connect."return_code ) -1; {//TODO: 如果错误
        perror();return
        close1local_socket;}
        ( 0)
    ;

    memset#”退出 send_and_receive_buffer, while, MAX_BUFFER(1
    //用户输入信息后,程序将输入的信息通过套接字发送给服务器 ,然后调用read函数从服务器中读取发送来的信息。
    //输入“)
    12345 ("Type in a string for 201930310035:"( {
        //TODO: "Type in a string for 201930310035:" 改为自己的学号,此处不要修改write调用和STDOUT_FILENO参数!
        write))STDOUT_FILENO, ;, strlen=();
        nr_bytes_read if read(STDIN_FILENO, send_and_receive_buffer, MAX_BUFFER0)//TODO: 调用read, 从STDIN_FILENO读
        ( )nr_bytes_read > ;=
            write(local_socket, send_and_receive_buffer, MAX_BUFFER);//TODO: 调用write,写socket
        nr_bytes_read if read(local_socket, send_and_receive_buffer, MAX_BUFFER0)//TODO: 调用read,读socket
        ( \nnr_bytes_read > );
            printfif"Message form server: %s(", send_and_receive_buffer[0
        ] ==send_and_receive_buffer'#')break ; }(
            );
    return
    close0local_socket;}
     
[+++]
编译后运行结果

服务器

客户端

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
TCP UDP IP 网络编程_java_内存溢出

TCP UDP IP 网络编程

TCP UDP IP 网络编程,第1张

查看while源代码 服务器代码
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include 
#include  

#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];


	/* socket: 服务器端开始建立sockfd描述符 */
	if ((local_listen_socket = socket(AF_INET, SOCK_STREAM, 0)) == -1) { // AF_INET i.e. IPV4; SOCK_STREAM i.e. TCP
		fprintf(stderr, "Socket error:%s\n\a", strerror(errno));
		exit(1);
	}

	/* 准备 sockaddr结构及其内部IP、端口信息 */
	bzero(&server_addr_info_struct, sizeof(struct sockaddr_in)); // 初始化,置0
	server_addr_info_struct.sin_family = AF_INET;                 // Internet
	server_addr_info_struct.sin_addr.s_addr = htonl(INADDR_ANY);  // 将本机host上的long数据转化为网络上的long数据,使服务器程序能运行在不同CPU的主机上 
													// INADDR_ANY 表示主机监听任意/所有IP地址。
	//server_addr_info_struct.sin_addr.s_addr=inet_addr("192.168.1.1");  //用于绑定到一个固定IP,inet_addr用于把数字加格式的ip转化为整形ip
	server_addr_info_struct.sin_port = htons(portnumber);         // (将本机器上的short数据转化为网络上的short数据)端口号

	/* bind: 绑定sockfd描述符 和 IP、端口 */
	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] = '('\n
		printf)"Server received %s;", buffer() /* 这个对话服务已经结束 */
		close;server_session_socket}( /* 下一个 */
	)

	/* 结束通讯 */
	close;local_listen_socket(0
	exit);}#include  
#define portnumber 3333
客户端代码
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include 
(

[

int main]int argc, char* argv);[ {
	int local_socket1024
	char buffer];;host
	struct sockaddr_in server_addr;
	struct hostent* if(

	!= 2argc ) (\a {
		fprintf\nstderr, "Usage:%s hostname [0", argv]);(1
		exit);}if
	((

	/* 使用hostname查询host 名字 */
	= (host 1 gethostbyname))argv[==]) ( NULL\n {
		fprintf)stderr, "ERR gethostbyname;"(1
		exit);}if
	((

	/* 客户程序开始建立 local_socket描述符 */
	= (local_socket , socket,AF_INET0 SOCK_STREAM)) ==) ; -1( { // AF_INET:Internet\aSOCK_STREAM:TCP
		fprintf\nstderr, "ERR socket:%s())", strerror;errno(1
		exit);}(
	&

	/* 客户程序填充服务端的资料 */
	bzero())server_addr, sizeof;server_addr=; // 初始化,置0
	server_addr.sin_family = AF_INET(          // IPV4
	server_addr.sin_port ) htons;portnumber()  // =将本机器上的short数据转化为网络上的short数据((端口号
	server_addr.sin_addr * *)struct in_addr-)host;>h_addr// /* IP地址

	*/ 客户程序发起连接请求 ((
	if ,connect(local_socket* )struct sockaddr(&),server_addr()) sizeof==struct sockaddr) ( -1\a {
		fprintf\nstderr, "ERR connect:%s())", strerror;errno(1
		exit);}(
	\n

	/* 连接成功了 */
	printf)"Please typein a string:;"(1024

	/* 读取和发送数据 */
	fgets)buffer, ;, stdin((
	write))local_socket, buffer, strlen;buffer()
	
	/* 结束通讯 */
	close;local_socket(0
	exit);}gcc server-while-tcp.c -o server-while-tcp
gcc client.c -o client

#include 
编译并在Ubuntu运行
#define MAX_BUFFER 1024
运行结果

服务器

客户端

修改服务器为多线程模式 服务器代码
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
(
#include 
#include 
//TODO: 某些头文件
)

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\n
    printf)"thread_session_socket = %d;", thread_session_socketwhile(
    1 )=( {
        nr_bytes_read 0 recv)thread_session_socket, receive_and_send_buffer, MAX_BUFFER, ;if(//TODO: 尝试从socket读取
        == )nr_bytes_read break -1;//TODO: 如果错误,或没能从socket读取字符
            (\n
        printf)"Message from client(%d): %s;", nr_bytes_read, receive_and_send_buffer;for
	char *p(	
	= ;p != receive_and_send_buffer) *p = '(') p++;
		*p ( toupper)*p;}        
	//TODO: 转换为大写
        write(thread_session_socket, receive_and_send_buffer, MAX_BUFFER); //TODO: 返回给客户端
    return
    close0thread_session_socket;}//TODO: 关闭socket
    ( []
)

int main;int argc, char* argv;;; {
    socklen_t size_of_client_sockaddr;
    pthread_t tid;
    int listen_socket;
    int session_socket;
    int return_codeif
    int port_number(

    struct sockaddr_in client_remote_sockaddr!=
    struct sockaddr_in server_local_sockaddr2

    //服务器端运行时要给出端口信息,该端口为监听端口 
    ) (argc \n [0 {
        printf]"Usage:%s port_number )", argv;return1;}
        = ([
    1

    //获得输入的端口 
    port_number ] atoi)argv;=(0)

    //创建套接字用于服务器的监听 
    listen_socket ; socket(AF_INET, SOCK_STREAM, )if(//TODO: socket==)
    ( "ERR socket."listen_socket ) -1; {//TODO: 如果出错
        perrorreturn1;}
        ( &0
    (

    //填充关于服务器的套节字信息
    memset));server_local_sockaddr, =, 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*;ifserver_local_sockaddr, sizeof(server_local_sockaddr==)//TODO: 调用bind绑定地址和端口(提供服务的位置)
    ( "ERR bind."return_code ) -1; {//TODO: 如果出错
        perror();return
        close1listen_socket;}//TODO: 关闭监听socket
        = (5
    )

    //监听指定端口,连接5个客户端 
    return_code ; listeniflisten_socket, (==)//TODO: 请求监听、提供服务
    ( "ERR listen."return_code ) -1; {//TODO: 如果出错
        perror();return
        close1listen_socket;}//TODO: 关闭监听socket
        #退出。 while(
    1

    //对每个连接来的客户端创建一个线程,单独与其进行通信。
    //首先调用read函数读取客户端发送来的信息,将其转换成大写后发送回客户端,)
    = (); {
        size_of_client_sockaddr 12345 sizeof(client_remote_sockaddr\n(
        //TODO: \n 改为自己的学号,此处不要修改write调用和STDOUT_FILENO参数!
        write))STDOUT_FILENO, "Listening & Accepting for 201930310035 ...;", strlen="Listening & Accepting for 201930310035 ...("()    
	session_socket & accept&listen_socket, )struct sockaddr*;ifclient_remote_sockaddr, (size_of_client_sockaddr==)//TODO: 调用accept阻塞,接到客户机时返回 session_socket
        if (session_socket == -1) {//TODO: 如果出错
            continue ;errno else EINTR( "ERR accept(): cannot accept client connect request")
            ; {
                perror();return
                close1session_socket;}//TODO: 关闭socket
                } (\n
            )
        ;
        printf="session_socket = %d(", session_socket&( //打印建立连接的客户端产生的套节字
        return_code ) pthread_create&)tid, NULL, thread_function, ;void*if(session_socket!=0//TODO: 调用 pthread_create,将 session_socket传递给 thread_function
        ) (return_code "ERR pthread_create()" ); {//TODO: 如果出错
            perror();(
            close)session_socket;return//TODO: 关闭一个socket
            close1listen_socket;}//TODO: 关闭另一个socket
            } return0
        ;
    }
    #include  #define MAX_BUFFER 1024(
[
客户端代码
#include 
#include 
#include 
#include 
#include 
#include 
]
#include 
//TODO: 某些头文件
)

int main;int argc, char* argv;[] {
    int  local_socket;
    int  return_code;
    char send_and_receive_buffer;MAX_BUFFER;if
    int  port_number(
    int  nr_bytes_read!=

    static struct sockaddr_in server_sockaddr3

    //客户端运行需要给出具体的连接地址和端口 
    ) (argc \n [0 {
        printf]"Usage: %s server_ip_address port_number )", argv;return1;}
        = ([
    2

    //获得输入的端口
    port_number ] atoi)argv;=(0)

    //创建套节字用于客户端的连接
    local_socket ; socketifAF_INET, SOCK_STREAM, (==)//TODO: 调用socket
    ( "ERR socket."local_socket ) -1; {//TODO: 如果错误
        perrorreturn1;}
        ( &0
    (

    //填充关于服务器的套节字信息
    memset));server_sockaddr, =, sizeof;server_sockaddr=(
    server_sockaddr.sin_family [ AF_INET1
    server_sockaddr.sin_addr.s_addr ] inet_addr)argv;=();
    server_sockaddr.sin_port = htons(port_number()

    //连接指定的服务器 
    return_code & connect(local_socket, ))struct sockaddr*;ifserver_sockaddr, sizeof(server_sockaddr==)//TODO: 调用connect
    ( "ERR connect."return_code ) -1; {//TODO: 如果错误
        perror();return
        close1local_socket;}
        ( 0)
    ;

    memset#”退出 send_and_receive_buffer, while, MAX_BUFFER(1
    //用户输入信息后,程序将输入的信息通过套接字发送给服务器 ,然后调用read函数从服务器中读取发送来的信息。
    //输入“)
    12345 ("Type in a string for 201930310035:"( {
        //TODO: "Type in a string for 201930310035:" 改为自己的学号,此处不要修改write调用和STDOUT_FILENO参数!
        write))STDOUT_FILENO, ;, strlen=();
        nr_bytes_read if read(STDIN_FILENO, send_and_receive_buffer, MAX_BUFFER0)//TODO: 调用read, 从STDIN_FILENO读
        ( )nr_bytes_read > ;=
            write(local_socket, send_and_receive_buffer, MAX_BUFFER);//TODO: 调用write,写socket
        nr_bytes_read if read(local_socket, send_and_receive_buffer, MAX_BUFFER0)//TODO: 调用read,读socket
        ( \nnr_bytes_read > );
            printfif"Message form server: %s(", send_and_receive_buffer[0
        ] ==send_and_receive_buffer'#')break ; }(
            );
    return
    close0local_socket;}
     

编译后运行结果

服务器

客户端

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/788531.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存