socket网络编程

 

TCP编程的服务器端一般步骤是:


1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt(); * 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、开启监听,用函数listen();
5、接收客户端上来的连接,用函数accept();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
8、关闭监听;


TCP编程的客户端一般步骤是:


1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置要连接的对方的IP地址和端口等属性;
5、连接服务器,用函数connect();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;



与之对应的UDP编程步骤要简单许多,分别如下:

UDP编程的服务器端一般步骤是:


1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、循环接收数据,用函数recvfrom();
5、关闭网络连接;



UDP编程的客户端一般步骤是:

1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置对方的IP地址和端口等属性;
5、发送数据,用函数sendto();
6、关闭网络连接;

--------------------------------

附:Linux网络编程同时支持tcp/udp的服务端简短程序

 

int main(int argc,char **argv){
int ld,sd,udp;

struct
sockaddr_in skaddr

int length;
fd_set fd;
int max ;
int n;
char buff[ 1000] ;

/*-----------------tcp---------------*/
if ( ( ld = socket ( PF_INET , SOCK_STREAM , 0 ) ) < 0) {
perror ( "Problem creating socket/n" ) ;
exit ( 1) ;
}
skaddr. sin_family = AF_INET ;
skaddr. sin_addr. s_addr = htonl ( INADDR_ANY ) ;
skaddr. sin_port = htons ( atoi ( argv[ 1] ) ) ;
if ( bind ( ld, ( struct sockaddr * ) & skaddr, sizeof ( skaddr) ) < 0) {
perror ( "Problem binding/n" ) ;
exit ( 0) ;
}
if ( listen ( ld, 5) < 0 ) {
perror ( "Error calling listen/n" ) ;
exit ( 1) ;
}

/*---------------------udp-----------------*/
if ( ( udp = socket ( PF_INET , SOCK_DGRAM , 0 ) ) < 0) {
printf ( "Problem creating socket/n" ) ; exit ( 1) ;
}
if ( bind ( udp, ( struct sockaddr * ) & skaddr, sizeof ( skaddr) ) < 0) {
printf ( "Problem binding/n" ) ;
exit ( 0) ;
}

max = ( ld > udp ? ld : udp) ;
while ( 1) {
/* Inialize the fd_set */
FD_ZERO( & fd) ;
FD_SET( ld, & fd) ; /* add passive tcp socket */
FD_SET( udp, & fd) ; /* add udp socket */

/*--------------select--------------*/
/* call select */
if ( select ( max + 1, & fd, NULL , NULL , NULL ) < 0) {
perror ( "select problem" ) ;
exit ( 1) ;
}

/*判断如果是tcp的socket执行那些操作*/
if ( FD_ISSET( ld, & fd) ) {
if ( ( sd = accept ( ld, ( struct sockaddr * ) & skaddr, & length) ) < 0) {
perror ( "accept problem" ) ;
exit ( 1) ;
}
while ( n = read ( sd, buff, 1000) ) {
if ( write ( sd, buff, n) < 0)
break ;
}
close ( sd) ;
}

/*判断如果是udp的socket执行那些操作*/

if ( FD_ISSET( udp, & fd) ) {
/* read a datagram from the socket (put result in bufin) */
n= recvfrom ( udp, buff, 1000, 0, ( struct sockaddr * ) & skaddr, & length) ;
if ( n< 0) {
perror ( "Error receiving data" ) ;
} else {
/* Got something, just send it back */
sendto ( udp, buff, n, 0, ( struct sockaddr * ) & skaddr, length) ;
}
}
}
}

----------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值