步骤一:1、服务端一次只能连接一个客户端。
2、客户端只能向服务端发送一次消息,消息返回后客户端和服务器程序结束。
3、客户端向服务端发送一个字符串,服务端将字符串改为大写后返还到客户端。
依次编译客户端和服务器源程序,然后使用ifconfig命令查看虚拟机IP地址,用于之后客户端使用这个IP地址访问服务器。
打开两个终端,客户端服务器各一个,先运行服务器端,再运行客户端,全部运行之后便可以通过客户端向服务器发送消息了。
#include
#include
#include
#include
#include
#define SERVPORT 8080
int main(int argc,int *argv[])
{
int sockfd;
int recv_len;
struct sockaddr_in servaddr,cliaddr;
char sendline[100];
char recvline[100];
if(argc != 2)
{
printf("need server address\n");
exit(0);
}
sockfd = socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERVPORT);
servaddr.sin_addr.s_addr = inet_addr(argv[1]);
connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr));
while(fgets(sendline,100,stdin) != NULL)
{
sendto(sockfd,sendline,strlen(sendline),0,
(struct sockaddr *)&servaddr,sizeof(servaddr));
recv_len = recvfrom(sockfd,recvline,100,0,NULL,NULL);
recvline[recv_len] = ';'fputs
(,recvlinestdout);}
close
()sockfd;return
0 ;}
#
服务器源码:
include#
include#
include#
include#
include#
include#
include#
include#
include#
defineSERVPORT 8080 int
main (int) argcint
{
, listenfd,connfd,recv_len;send_lensocklen_t
; clilenstruct
sockaddr_in , servaddr;cliaddrchar
[ buff100];=
listenfd socket (,AF_INET,SOCK_STREAM0);bzero
(&,servaddrsizeof()servaddr);.
servaddr=sin_family ; AF_INET.
servaddr=sin_port htons ()SERVPORT;.
servaddr.sin_addr=s_addr htonl ()INADDR_ANY;bind
(,listenfd(structsockaddr * )&,servaddrsizeof()servaddr);printf
("bind is sucessifully!\n");listen
(,listenfd10);=
connfd accept (,listenfd(structsockaddr * )&,cliaddr&)clilen;printf
("connect sucessifully!\n");=
recv_len recv (,connfd,buff100,0);[
buff]recv_len= ';' printf(
"received the following:\n");printf(
"%s",);bufffor(
int=0 i;<; i++recv_len) i[]
{
buff=itoupper ( []buff)i;}=
send
send_len ( ,,connfd,buff0recv_len);close(
);listenfdreturn0
; }#
include
二、TCP通信,服务端与客户端实现多次通信
功能描述:
步骤同第一个(省) 客户端源码:1、服务端一次只能连接一个客户端。
2、客户端可以向服务端多次发送消息,直到客户端发送一个空的消息后,客户端和服务器程序结束。
3、客户端向服务端发送一个字符串,服务端将字符串改为大写后返还到客户端。
#include
#include
#include
#include
#include
#include
#include
#define
SERVPORT8080 int main
( int,char argc*[ ]argv)int;
{
int sockfd;
struct recv_lensockaddr_in
, ; servaddrcharcliaddr[
100 sendline];char[
100 recvline];if(
!=2argc ) printf(
{
"need server address\n");exit(
0);}=
socket
sockfd ( ,,AF_INET0SOCK_STREAM);bzero(
&,sizeofservaddr())servaddr;.=
servaddr;sin_family . AF_INET=
servaddrhtonssin_port ( );SERVPORT..
servaddr=sin_addrinet_addrs_addr ( [1argv]);connect(
,(sockfdstructsockaddr* ) &,sizeofservaddr())servaddr;printf(
"send to service : ");while(
fgets(,100sendline,stdin)!=NULL ) send(
{
,,sockfdstrlensendline(),sendline0);=recv
recv_len ( ,,sockfd100recvline,0);[]
recvline=recv_len';' printf ("back from service: "
);fputs(,
stdout)recvline;printf("------------------------------\n"
);printf("send to service : "
);//close(sockfd);//break;}
close
(
)
;returnsockfd0;
} #include
#
服务器源码:
include#
include#
include#
include#
include#
include#
include
#include#
defineSERVPORT
8080int main (
int )int, argc,
{
, listenfd;connfdsocklen_trecv_len;send_lenstruct
sockaddr_in clilen,
; char servaddr[cliaddr100
] buff;=socket(
listenfd , ,0AF_INET)SOCK_STREAM;bzero(&
,sizeof(servaddr));servaddr.=;
servaddr.sin_family = AF_INEThtons
servaddr(sin_port ) ;.SERVPORT.=
servaddrhtonlsin_addr(s_addr ) ;bindINADDR_ANY(,
(structlistenfdsockaddr*) & ,sizeof(servaddr));servaddrprintf("bind is sucessifully! \n"
);listen(,
10)listenfd;printf("Waiting for clients to connect...\n"
);=accept(
connfd , (structlistenfdsockaddr*) & ,&)cliaddr;printfclilen("%d connect sucessifully!\n"
,);whileconnfd(1
)=recv(
{
recv_len , ,100connfd,buff0);if(==
0)recv_len break ;}
{
[]
=
buff';'recv_lenprintf ( "received the following:\n")
;printf("%s",
);for(buffint=
0;< i;++) i[recv_len] i=toupper
{
buff(i[ ] );buff}i=send(
,
send_len , ,0connfd)buff;recv_len}close()
;
return0listenfd;}
# include#
include
三、多线程实现TCP-Socket通信
功能描述:
步骤一:1、服务端可以同时连接多个客户端。
2、多个客户端并发运行,同时实现与服务器的通信。
3、客户端向服务端发送一个字符串,服务端将字符串改为大写后返还到客户端。
4、客户端全部关闭时,服务器仍然运行,当有新的客户端连接时,继续工作。
依次编译客户端和服务器源程序,然后使用ifconfig命令查看虚拟机IP地址,用于之后客户端使用这个IP地址访问服务器。
然后打开三个终端,一个为服务器,两个为客户端,
照着下图,先运行服务器,再运行客户端,全部运行之后便可以通过客户端向服务器发送消息了。
#include
#include
#include
#include
#include
#
include#define
SERVPORT8080
intmain ( int
, char*[ argc]) intargv;int;
{
struct sockfdsockaddr_in
, recv_len;
char [ servaddr100cliaddr]
; sendlinechar[100]
; recvlineif(!=2
)printfargc ( "need server address\n")
{
;exit(0)
;}=socket(
,
sockfd , 0)AF_INET;SOCK_STREAMbzero(&,
sizeof()servaddr);.servaddr=;.
servaddr=sin_family htons AF_INET(
servaddr)sin_port ; ..SERVPORT=inet_addr
servaddr(sin_addr[s_addr 1 ])argv;connect(,(
structsockaddrsockfd*)& , sizeof()servaddr);printfservaddr("send to service : ")
;while(fgets(
,100,stdinsendline)!=NULL)send ( ,,
{
strlen(sockfd)sendline,0)sendline;=recv(,
recv_len , 100,sockfd0recvline);[]=';'
recvline// 给接收到的结果加上字符串结束符recv_lenprintf ( "back from service: ") ;
fputs(,stdout)
;//将收到的结果发送到控制台recvlineprintf("------------------------------\n") ;
printf("send to service : ");
//close(sockfd);//break;}close(
)
;
return
0;sockfd}#
include #include
#
服务器源码
include#
include#
include#
include#
include
#include
#include#
defineSERVPORT
8080#
defineCONNECTNUM 10 void
thread_fun( void *
) int=* ( cconnfdint
{
* connfd );int, ;charcconnfd[
100 recv_len]send_len;
while buff(1)=
recv(,,
{
recv_len 100 ,0connfd)buff;if(==0)
break;recv_len } []
{
=';'
printf
buff(recv_len"received from client%d the following:\n" , );
printf("%s",connfd);
for(int=buff0;
<;++ i)[] i=recv_lentoupper i([
{
buff]i) ; }=buffsendi(,,
,
send_len 0 );connfdprintfbuff(recv_len"have replied client%d ,over. \n ",);
printf("------------------------------ \n")connfd;}
pthread_exit(NULL);
}
intmain(int)
int
, ,,; argcsocklen_t
{
; listenfdstructconnfdsockaddr_inrecv_len,send_len;
char clilen[
100 ] servaddr;cliaddrpthread_t
[ buff];=socket
( pid,CONNECTNUM,0
listenfd ) ;bzeroAF_INET(SOCK_STREAM&,sizeof(
));servaddr.=;servaddr.=htons
servaddr(sin_family ) AF_INET;
servaddr.sin_port . =htonlSERVPORT()
servaddr;sin_addrbinds_addr ( ,(INADDR_ANYstructsockaddr
*)listenfd&,sizeof ( ));servaddrprintf("bind is sucessifully! \n"servaddr);listen
(,10);
printf(listenfd"Waiting for clients to connect...\n");for
(int=0;
<;++ j )=accept j(CONNECTNUM, j(struct
{
connfd sockaddr *)listenfd&,& ) ;printf(cliaddr"%d connect sucessifully!\n",clilen);
pthread_create(&[connfd],
NULL,(pidvoidj*),&); }closethread_fun()connfd;return
0
;}listenfd
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)