c语言socket网络编程控制(c语言的socket编程)

http://www.itjxue.com  2023-02-28 07:31  来源:未知  点击次数: 

socket网络编程

客户端与服务端通过socket套字节连接后都会返回一个实例对象,分别保存这个对象,就相当于保存的对方的地址。不同的客户端连接到服务器,得到的对象都是不同的。服务端要发信息直接拿这个对象进行操作就可以了。

很久没写了,具体名称记不起来了,思路就是这样的

在windows下,如何用纯C语言实现socket网络编程?

mfc只是对socket进行了一些封装,大部分人做网络编程都是用的原始的socket,比如如下接口都可以在c下进行调用

1.socket()

2.bind()

3.connect()

4.listen()

5.accept()

6.send() 和recv()

7.sendto() 和recvfrom()

8.close() 和shutdown()

9.getpeername()

10.gethostname()

这些接口是在Winsock2.h中定义的不是在mfc中定义的,你只需要包含Winsock2.h头文件和Ws2_32.lib库就可以了。

怎样用C语言做socket网络编程?

mfc只是对socket进行了一些封装,大部分人做网络编程都是用的原始的socket,比如如下接口都可以在c下进行调用\x0d\x0a 1.socket() \x0d\x0a 2.bind() \x0d\x0a 3.connect() \x0d\x0a 4.listen() \x0d\x0a 5.accept() \x0d\x0a 6.send() 和recv() \x0d\x0a 7.sendto() 和recvfrom() \x0d\x0a 8.close() 和shutdown() \x0d\x0a 9.getpeername() \x0d\x0a 10.gethostname() \x0d\x0a这些接口是在Winsock2.h中定义的不是在mfc中定义的,你只需要包含Winsock2.h头文件和Ws2_32.lib库就可以了。

关于c语言的socket网络编程

sender

没有看到

i

打印,是由于你没有加换行,由于标准输出是行缓冲,所以不会马上打印,而是要等遇到

\n

或者进程结束才会打印。你可以写成

printf("%d\n");

就能看到发送方的打印。

接收方也可以加上printf来打印。

这么简单的程序,用gdb自己调试也可以。

linux下C语言socket编程双机互发数据

这个问题很好办啦,服务器接受一个连接请求,然后开一个线程或者进程都可以,再在线程或者进程里面采用其他技术实现同时收发(比如I/O复用,比如非阻塞I/O)。客户端也可以采用I/O复用。

推荐资料的话,《unix网络编程》这本书很好,公认的经典,当教科书用,这本书里有你想要的所有内容。

ps:你基础太差,多补补吧,别想一下吃个胖子。

另外我这里正好有个例子满足你的要求,贴给你,自己写的,不是网上找的,用的是多进程加I/O复用技术:

server端:

/****************************************************************

**

**

**

****************************************************************/

#include stdio.h

#include stdlib.h

#include sys/types.h

#include sys/socket.h

#include arpa/inet.h

#include netinet/in.h

#include errno.h

#include string.h

#include signal.h

#include sys/wait.h

#include sys/select.h

#include sys/time.h

#include unistd.h

#define BUFLEN 1024

#define MAX(a,b) ((a)(b)?(a):(b))

typedef void Sigfunc (int);

void str_echo(FILE *,int);

//Sigfunc *signal(int, Sigfunc *);

int main(int argc,char **argv)

{

int connfd,listenfd;

pid_t childpid;

socklen_t clilen;

struct sockaddr_in cliaddr,servaddr;

void sig_chld(int);

listenfd = socket(AF_INET, SOCK_STREAM, 0);

memset(servaddr,0,sizeof(servaddr));

servaddr.sin_family = AF_INET;

servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

servaddr.sin_port = htons(5358);

bind(listenfd,(struct sockaddr*)servaddr,sizeof(servaddr));

listen(listenfd,8);

signal(SIGCHLD,sig_chld);

while(1)

{

clilen = sizeof(cliaddr);

if((connfd = accept(listenfd,(struct sockaddr*)cliaddr,clilen)) 0)

{

if(errno == EINTR)

{

fputs("accept error: EINTR\n",stdout);

continue;

}

else

{

fputs("accept error..\n",stdout);

}

}

if((childpid = fork()) == 0)

{

close(listenfd);

str_echo(stdin,connfd);

exit(0);

}

close(connfd);

}

}

void str_echo(FILE *fp,int sockfd)

{

int n = 0;

char sendbuf[BUFLEN] = { 0 },recvbuf[BUFLEN] = { 0 };

int maxfdp;

fd_set rset;

FD_ZERO(rset);

while(1)

{

FD_SET(fileno(fp),rset);

FD_SET(sockfd, rset);

maxfdp = MAX(fileno(fp),sockfd)+1;

select(maxfdp, rset ,NULL, NULL, NULL);

if(FD_ISSET(sockfd, rset))

{

if(n = read(sockfd, recvbuf, BUFLEN) == 0)

{

return;

}

if(n == -1)

{

break;

}

printf("%s\n",recvbuf);

memset(recvbuf,0,BUFLEN);

}

if(FD_ISSET(fileno(fp),rset))

{

scanf("%s",sendbuf);

write(sockfd, sendbuf,strlen(sendbuf));

}

}

}

void sig_chld (int signo)

{

pid_t pid;

int stat;

while ((pid = waitpid(-1,stat, WNOHANG)) 0)

{

printf("child %d terminated\n",pid);

}

return;

}

client端:

#include stdio.h

#include sys/types.h

#include sys/socket.h

#include sys/select.h

#include arpa/inet.h

#include netinet/in.h

#include string.h

#define MAX(a,b) (a)(b)?(a):(b)

int main()

{

int s,connectReturn, maxfd;

fd_set rset;

char sendbuf[1024] = {0};

char recvbuf[1024] = {0};

long port=5358;

s=socket(PF_INET,SOCK_STREAM,0);

struct sockaddr_in sa;

sa.sin_family=AF_INET;

sa.sin_addr.s_addr=inet_addr("127.0.0.1");

sa.sin_port=htons(port);

connectReturn=connect(s,(struct sockaddr *)sa,sizeof(sa));

printf("%d\n",connectReturn);

FD_ZERO(rset);

while(1)

{

FD_SET(fileno(stdin), rset);

FD_SET(s, rset);

maxfd=MAX(fileno(stdin), s) + 1;

select(maxfd, rset, NULL, NULL, NULL);

if(FD_ISSET(fileno(stdin), rset))

{

scanf("%s",sendbuf);

send(s,sendbuf,strlen(sendbuf),0);

bzero(sendbuf, 1024);

}

else if(FD_ISSET(s, rset))

{

memset(recvbuf,0,1024);

recv(s,recvbuf,1024,0);

printf("remote: %s\n",recvbuf);

}

}

return 0;

}

(责任编辑:IT教学网)

更多

推荐网站策划文章