基于Socket的UDP和TCP编程解析 2

客户端的工作流程:首先调用socket函数创建一个socket,然后调用bind函数将其与本机地址以及一个本地端口号绑定,请求连接服务器,通过新的socket向客户端发送字符串” hi,i am client!”。最后关闭该socket。
main()
{
int cli_sockfd; /*客户端socket */
int addrlen;
char seraddr[14];
struct sockaddr_in ser_addr, /* 服务器的地址*/
cli_addr; /* 客户端的地址*/
char msg[max_msg_size]; /* 缓冲区*/
getserveraddr( seraddr );
cli_sockfd = socket( af_inet, sock_stream, 0 ); /*创建连接的socket */
if ( ser_sockfd < 0 )
{ /*创建失败 */
fprintf( stderr, socker error:%sn, strerror( errno ) );
exit( 1 );
}
/* 初始化客户端地址*/
addrlen = sizeof(struct sockaddr_in);
bzero( &ser_addr, addrlen );
cli_addr.sin_family = af_inet;
cli_addr.sin_addr.s_addr = htonl( inaddr_any );
cli_addr.sin_port = 0;
if ( bind( cli_sockfd, (struct sockaddr *) &cli_addr, addrlen ) < 0 )
{
/*棒定失败 */
fprintf( stderr, bind error:%sn, strerror( errno ) );
exit( 1 );
}
/* 初始化服务器地址*/
addrlen = sizeof(struct sockaddr_in);
bzero( &ser_addr, addrlen );
ser_addr.sin_family = af_inet;
ser_addr.sin_addr.s_addr = inet_addr( seraddr );
ser_addr.sin_port = htons( server_port );
if ( connect( cli_sockfd, (struct sockaddr *) &ser_addr, &addrlen ) != 0 ) / 请求连接 /
{
/*连接失败 */
fprintf( stderr, connect error:%sn, strerror( errno ) );
close( cli_sockfd );
exit( 1 );
}
strcpy( msg, hi,i am client! );
send( sockfd, msg, sizeof(msg), 0 ); / 发送数据 /
recv( sockfd, msg, max_msg_size, 0 ); /* 接受数据*/
printf( %sn, msg ); /*在屏幕上打印出来 */
close( cli_sockfd );
}
服务器的工作流程:首先调用socket函数创建一个socket,然后调用bind函数将其与本机地址以及一个本地端口号绑定,接收到一个客户端时,服务器显示该客户端的ip地址,并将字串返回给客户端。
3、udp/ip应用编程接口(api)
int main( int argc, char **argv )
{
int ser_sockfd;
int len;
/* int addrlen; */
socklen_t addrlen;
char seraddr[100];
struct sockaddr_in ser_addr;
/ 建立socket /
ser_sockfd = socket( af_inet, sock_dgram, 0 );
if ( ser_sockfd < 0 )
{
printf( i cannot socket successn );
return(1);
}
/ 填写sockaddr_in 结构 /
addrlen = sizeof(struct sockaddr_in);
bzero( &ser_addr, addrlen );
ser_addr.sin_family = af_inet;
ser_addr.sin_addr.s_addr = htonl( inaddr_any );
ser_addr.sin_port = htons( server_port );
/*绑定客户端
if(bind(ser_sockfd,(struct sockaddr *)&ser_addr,addrlen)<0){printf(connect);return 1;}while(1){bzero(seraddr,sizeof(seraddr));len=recvfrom(ser_sockfd,seraddr,sizeof(seraddr),0,(struct sockaddr*)&ser_addr,&addrlen);/ 显示client端的网络地址 /printf( receive from %sn, inet_ntoa( ser_addr.sin_addr ) );
/ 显示客户端发来的字串 /
printf( recevce:%s, seraddr );
/ 将字串返回给client端 /
sendto( ser_sockfd, seraddr, len, 0, (struct sockaddr *) &ser_addr, addrlen );
}
客户端的工作流程:首先调用socket函数创建一个socket,填写服务器地址及端口号,从标准输入设备中取得字符串,将字符串传送给服务器端,并接收服务器端返回的字符串。最后关闭该socket。
int getserveraddr( char * addrname )
{
printf( please input server addr: );
scanf( %s, addrname );
return(1);
}
int main( int argc, char **argv )
{
int cli_sockfd;
int len;
socklen_t addrlen;
char seraddr[14];
struct sockaddr_in cli_addr;
char buffer[256];
getserveraddr( seraddr );
/* 建立socket*/
cli_sockfd = socket( af_inet, sock_dgram, 0 );
if ( cli_sockfd < 0 )
{
printf( i cannot socket successn );
return(1);
}
/* 填写sockaddr_in*/
addrlen = sizeof(struct sockaddr_in);
bzero( &cli_addr, addrlen );
cli_addr.sin_family = af_inet;
cli_addr.sin_addr.s_addr = inet_addr( seraddr );
/* cli_addr.sin_addr.s_addr=htonl(inaddr_any); */
cli_addr.sin_port = htons( server_port );
bzero( buffer, sizeof(buffer) );
/* 从标准输入设备取得字符串*/
len = read( stdin_fileno, buffer, sizeof(buffer) );
/* 将字符串传送给server端*/
sendto( cli_sockfd, buffer, len, 0, (struct sockaddr *) &cli_addr, addrlen );
/* 接收server端返回的字符串*/
len = recvfrom( cli_sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *) &cli_addr, &addrlen );
/* printf(receive from %sn,inet_ntoa(cli_addr.sin_addr)); */
printf( receive: %s, buffer );
close( cli_sockfd );
}
四、调试makefile文件为:
cc=gcc
all:server client
cflags=-o
server: server.c
**(cc) **(cflags) $@ server.c
client: client.c
**(cc) **(cflags) $@ client.c
clean:
rm -f server client
运行结果如下图:在shell中执行make进行编译,make clean删除生成文件。

卷积码编码器怎么画 浅谈卷积码编码器设计
工业智能网关BL110应用之26:实现三菱 PLC FX3U 接入OPC UA云平台
如何运用先进技术来打造智慧工地开启建造新时代
如何防范勒索病毒,目前可防不可解,已在各高校爆发
IC封装基板以及主要厂商介绍
基于Socket的UDP和TCP编程解析 2
你种的树成功了吗?当初支付宝抢能量种的树,如今长成这样
三菱PLC的汇点式、分组式、分割式接线方式
国产32位MCU芯片CS32F030系列介绍
VMware虚拟机配置文件丢失的数据恢复案例
国家斥巨资投入半导体领域,中国芯未来可期
关于NB-IoT的同步信号的简单分析
使用Arduino的带有语音警报的运动传感器
iphone8发布会回顾:盘点iPhone8中的七大黑科技,iPhoneX才是主角,9月15日正式上市,5888起又要剁手了
5G等技术与行业应用融合发展,全面打造全场景智慧城市
机房环境监控系统的功能概括以及应用情况
高压探头使用方法是什么?
MAX2371宽带低噪声放大器(LNA) 带有步进衰减器及VGA
产业链上下游重组,芯片的迭代似乎跟不上产品
民国电台是怎样传输的 民国时期的电台能传多远?