c语言socket网络编程控制(c语言的socket编程)
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;
}