我正在尝试插座编程。我已经使用了以下文件inetaddr.c,我使用的是Ubuntu 12.04。 以下代码不会在我执行它时在控制台上显示我当前的运行进程。我尝试了以下两个命令。
system(“netstat -pa --tcp 2> / dev / null | sed -n'1,/ ^ Proto / p; / inetaddr / p'”);
甚至
system(“lsof -i tcp | sed -n'1p; / inetaddr / p'”);
我编码的内容有什么问题吗?如何通过netstat或lsof命令查看正在运行的进程?
/* inetaddr.c:
*
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
static void bail(const char *on_what) {
fputs(on_what,stderr);
fputc('\n',stderr);
exit(1);
}
int main(int argc,char **argv) {
int z=0;
struct sockaddr_in adr_inet;/* AF_INET */
int len_inet; /* length */
int sck_inet; /* Socket */
/* Create a Socket */
sck_inet = socket(AF_INET,SOCK_STREAM,0);
printf("sck_inet = %d, PID = %u\n", sck_inet, getpid());
if ( sck_inet < 0 )
bail("socket()");
/* Establish address */
memset(&adr_inet,0,sizeof(adr_inet));
adr_inet.sin_family = AF_INET;
adr_inet.sin_port = htons(9000);
adr_inet.sin_addr.s_addr = inet_addr("127.0.0.95");
if ( adr_inet.sin_addr.s_addr == INADDR_NONE )
bail("bad address.");
len_inet = sizeof(adr_inet);
printf("z value = %d before bind\n",z );
z = bind(sck_inet, (struct sockaddr *)&adr_inet,len_inet);
printf("z value = %d\n",z );
if (z==-1)
bail("bind()");
/* Display our socket address */
system("lsof -i tcp | sed -n '1p;/inetaddr/p'");
//system("netstat -pa --tcp 2>/dev/null | sed -n '1,/^Proto/p;/bind/p'");
return 0;
}
all:
gcc -c -D_GNU_SOURCE -Wall inetaddr.c
gcc inetaddr.o -o inetaddr
答案 0 :(得分:0)
尝试在netstat之前添加一个listen套接字。像这样:
/* Display our socket address */
listen(sck_inet,50); /* <--- Add this */
system("lsof -i tcp | sed -n '1p;/inetaddr/p'");
//system("netstat -pa --tcp 2>/dev/null | sed -n '1,/^Proto/p;/bind/p'");
return 0;