
* Author: root
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdbool.h>
#include "Utility.h"
//多路复用,一个server绑定多个端口,处理多个服务
int main(int argc, char** argv) {
if(argc<3)
{ //参数验证
DieWithUserMessage("param","<timeout(sec.)><port/service>...")
}
long timeout=atol(argv[1])
int noPorts=argc-2
int server_socks[noPorts]
int maxDescriptor=-1
for(int port=0port<noPortsport++)
{
//后面的参数全部是端口,建立socket
server_socks[port]=SetupTCPServerSocket(argv[port+2])
//选择最大的sock描述符
if(server_socks[port]>maxDescriptor)
maxDescriptor=server_socks[port]
Socket通信创建步骤:
(1)通过socket()函数创建socket
(2)通过bind函数绑定socket于设备地址
(3)进行读写 *** 作read/recv/recvfrom write/send/sendto
(4)close方法关闭套接字
例子如下:
test1.c
#include <stdio.h>#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(void)
{
//create socket
int fd = socket(AF_INET, SOCK_DGRAM, 0)
if(fd==-1)
{
perror("socket\n")
exit(-1)
}
printf("socket fd=%d\n",fd)
//build connection address
struct sockaddr_in addr
addr.sin_family = AF_INET
addr.sin_port = htons(6666)
addr.sin_addr.s_addr = inet_addr("127.0.0.1")
int r
r = bind(fd,(struct sockaddr*)&addr,sizeof(addr))
if(r==-1)
{
perror("bind")
close(fd)
exit(-1)
}
printf("bind address successful!\n")
//accept or send message
char buf[255]
struct sockaddr_in from
socklen_t len
len = sizeof(from)
while(1)
{
r = recvfrom(fd,buf,sizeof(buf)-1,0,(struct sockaddr*)&from,&len)
if(r>0)
{
buf[r]=0
printf("The message from %s is:%s\n",inet_ntoa(from.sin_addr),buf)
}
else
{
break
}
}
//close socket
close(fd)
return 0
}
test2.c
#include <stdio.h>#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(void)
{
//create socket
int fd = socket(AF_INET,SOCK_DGRAM,0)
if(fd==-1)
{
perror("socket")
exit(-1)
}
printf("create socket OK!\n")
//create an send address
struct sockaddr_in addr={}
addr.sin_family = AF_INET
addr.sin_port = htons(6666)
addr.sin_addr.s_addr=inet_addr("127.0.0.1")
//send the message to the specify address
int r
char buf[255]
while(1)
{
r = read(0,buf,sizeof(buf)-1)
if(r<=0)
break
sendto(fd,buf,r,0,(struct sockaddr*)&addr,sizeof(addr))
}
//close socket
close(fd)
return 0
}
先运行test1.c,然后运行test2.c,在test2.c运行后输入内容,在test1.c所在终端中就会显示信息
运行结果如下:
[root@raykaeso ~]# netstat -ntlp //查看服务器运行的进程服务和监听端口Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:8005 0.0.0.0:* LISTEN 16725/java
tcp 0 0 0.0.0.0:8009 0.0.0.0:* LISTEN 16725/java
tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 2138/mongod
tcp 0 0 0.0.0.0:8010 0.0.0.0:* LISTEN 14335/java
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 859/memcached
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 16725/java
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 872/httpd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 873/sshd
tcp6 0 0 :::3306 :::* LISTEN 23443/mysqld
tcp6 0 0 :::11211 :::* LISTEN 859/memcached
tcp6 0 0 :::22 :::* LISTEN 873/sshd
Linux netstat命令是显示网络连接、路由表和网络接口信息,可以让用户得知有哪些网络连接正在运作。使用时如果不带参数,netstat显示活动的 TCP 连接。netstat命令用来打印Linux中网络系统的状态信息最常用的命令之一。
netstat参数:
-a:显示所有连线中的Socket
-A:列出该网络类型连线中的相关地址
-c:持续列出网络状态
-C:显示路由器配置的快取信息
-e:显示网络其他相关信息
-F:显示FIB
-g:显示多重广播功能群组组员名单
-h:在线帮助
-i:显示网络界面信息表单
-l:显示监控中的服务器的Socket
-M:显示伪装的网络连线
-n:直接使用ip地址,而不通过域名服务器
-N:显示网络硬件外围设备的符号连接名称
-o:显示计时器
-p:显示正在使用Socket的程序识别码和程序名称
-r:显示Routing Table
-s:显示网络工作信息统计表
-t:显示TCP传输协议的连线状况
-u:显示UDP传输协议的连线状况
-v:显示指令执行过程
-V:显示版本信息
-w:显示RAW传输协议的连线状况
[root@localhost ~]# netstat -ntlp //查看服务器运行的进程服务和监听端口
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:8005 0.0.0.0:* LISTEN 16725/java
tcp 0 0 0.0.0.0:8009 0.0.0.0:* LISTEN 16725/java
tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 2138/mongod
tcp 0 0 0.0.0.0:8010 0.0.0.0:* LISTEN 14335/java
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 859/memcached
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 16725/java
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 872/httpd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 873/sshd
tcp6 0 0 :::3306 :::* LISTEN 23443/mysqld
tcp6 0 0 :::11211 :::* LISTEN 859/memcached
tcp6 0 0 :::22 :::* LISTEN 873/sshd
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)