这里主要是代码,网上有原理
socket 有同步,异步之分,我这是个同步的,同步又有阻塞和非阻塞之分,
这的非阻塞是用select()函数实现的
客户端:
#include <errno.h>
#include <sys/types.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <assert.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define servport 2000
#define maxdatasize 100
int main(int argc,char ** argv){
int sockfd,recvbytes,f;
char buf[maxdatasize];
struct hostent *host;
struct sockaddr_in serv_addr;
fd_set rfds,wfds;
struct timeval timeout={10,0};
if(argc<2){
printf("please enter the service's hostname!\n");
exit(1);
}
if((host=gethostbyname(argv[1]))==NULL){
perror("gethostbyname error");
exit(0);
}
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){
perror("create socker error");
exit(0);
}
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(servport);
serv_addr.sin_addr=*((struct in_addr *)host->h_addr);
bzero(&(serv_addr.sin_zero),8);
if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))==-1){
perror("connect error");
exit(1);
}
while(1){
tt:
// tt
usleep(1000);
FD_ZERO(&rfds);
FD_SET(sockfd,&rfds);
FD_ZERO(&wfds);
FD_SET(sockfd,&wfds);
f=select(sockfd+1,&rfds,&wfds,NULL,&timeout);
switch(f){
case -1:
perror("error");
exit(0);
case 0:
perror("等待超时");
goto tt ;
default:
if(FD_ISSET(sockfd,&rfds)){
read(sockfd,&buf,50);
printf("server data is :%s",&buf);
}
if(FD_ISSET(sockfd,&wfds)){
write(sockfd,"$GPRMC,011728.000,A,3029.1966,N,11424.2966,E,8.34,280.72,110409,,,A*67",sizeof("$GPRMC,011728.000,A,3029.1966,N,11424.2966,E,8.34,280.72,110409,,,A*67"));
printf("sent success");
}
}
/**
if(f<=0){
perror("select error");
printf("connect error,sleep 1000");
usleep(1000);
continue ;
}
if(FD_ISSET(sockfd,&rfds)){
read(sockfd,&buf,50);
printf("read data is:%s",&buf);
}
if(FD_ISSET(sockfd,&wfds)){
write(sockfd,"icome from client",50);
printf("client write something to server");
}
**/
/**
if((recvbytes=read(sockfd,&buf,50))==-1){
perror("read error");
exit(0);
}
buf[recvbytes]='\0';
printf("read server val:%s",buf);
printf("enter content:");
**/
// int num=0;
// while((content[num++]=getchar())!='\n');
/**
if(send(sockfd,&gd,sizeof(struct gpsdata),0)==-1){
perror("write error");
exit(0);
}
**/
// write(sockfd,"\n",2);
}
return 0;
}//main
服务器端:
#include <stdio.h>
#include <stdlib.h>
#include <sys/select.h>
#include <errno.h>
#include <sys/types.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <assert.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define SERVPORT 3333
#define BACKLOG 10
#define dataSize 100
main(){
int sockfd,client_fd;
struct sockaddr_in my_addr;
struct sockaddr_in remote_addr;
char buf[dataSize] ;
fd_set rfds,wfds;
struct timeval timeout={3,0};
int tags;
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){
perror("socket create erro");
exit(1);
}
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_family=AF_INET;
my_addr.sin_addr.s_addr=INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1){
perror("bind error");
exit(1);
}
if(listen(sockfd,BACKLOG)==-1){
perror("lister error");
exit(1);
}
while(1) {
int sin_size=sizeof(struct sockaddr_in);
if((client_fd=accept(sockfd,(struct sockaddr *)&remote_addr,&sin_size))==-1){
perror("accept error");
continue;
}
printf("received a connection from %s\n",inet_ntoa(remote_addr.sin_addr));
if(!fork()){
char content[50];
while(1){
gg:
FD_ZERO(&rfds);
FD_SET(client_fd,&rfds);
FD_ZERO(&wfds);
FD_SET(client_fd,&wfds);
tags=select(client_fd+1,&rfds,&wfds,NULL,&timeout);
switch(tags){
case -1:
printf("出错");
exit(-1); break;
case 0:
printf("没有数据");
continue gg ;
default:
if(FD_ISSET(client_fd,&rfds)){
read(client_fd,&content,50);
printf("client data is :%s",&content);
}
if(FD_ISSET(client_fd,&wfds)){
write(client_fd,"i come from server ",50);
}
break;
}
}
close(client_fd);
exit(0);
}
}
}
分享到:
相关推荐
首先,Linux C Socket编程是使用C语言在Linux操作系统下进行网络通信的一种方式。Socket接口是网络编程的标准接口,它提供了进程间通信(IPC)的能力,尤其是在不同主机之间进行数据传输。在C语言中,我们通常使用`...
在Linux环境下,C语言的Socket编程是一种常用的技术,用于实现网络通信。面向连接的Socket编程主要涉及TCP协议,这是一种提供可靠、基于字节流的传输层协议。本实例展示了如何构建一个简单的TCP服务器和客户端。 ...
本篇文章将深入探讨Linux下的C语言SOCKET编程,包括客户端和服务器端的实现。 首先,我们要理解SOCKET的基本概念。在计算机网络中,SOCKET是一种进程间通信(IPC)机制,它允许通过网络连接的两台机器上的进程相互...
在Linux操作系统中,Socket编程通常采用C语言,因为传统的GNU C库提供了丰富的Socket API函数,但这些函数是面向过程设计的,没有面向对象的封装,使用起来比较复杂。利用C++进行Socket编程,可以通过自定义类来封装...
文档提到了Linux公社网站,这表明了作者可能提供了一个与Linux操作系统相关的信息网站的链接,其中可能包含更多关于Linux平台下C语言Socket编程的资源和教程。 ### 总结 整个文档是一份对于初学者友好、深入浅出的...
Socket编程是C语言在实现网络通信中的核心部分,它允许不同计算机之间的进程进行数据交换。本项目涉及的"Linux C语言 socket通信聊天小程序"是一个基础的网络聊天应用,支持群聊和私聊功能。 首先,我们需要理解...
3. **Socket编程**: - Socket是进程间通信的一种方式,尤其适用于网络通信。 - 在Linux下,使用`socket()`函数创建套接字,`bind()`函数绑定IP地址和端口号,`listen()`函数使服务器进入监听状态,`accept()`函数...
在Linux操作系统中,Socket编程是一种实现网络通信的基本方式,它为进程间通信(IPC)提供了接口,同时也广泛应用于客户端和服务器之间的数据交换。本聊天软件是基于Linux Socket编程实现的,尽管目前还不支持用户...
/* * 使用规则: * 可以发送带附件的邮件,附件大小限制由发送方服务器而定,暂未测试具体为多少MB * 附件可以是多个 ...支持windows系统,linux系统。 上一版本的更新版。 详细情况件压缩包的readme
综上所述,整个文档所涉及的知识点是围绕CAN总线技术及其在Linux下的Socket编程展开的,涵盖了从基础概念到实际编程应用的全方位内容。这对于需要在Linux环境下进行CAN总线开发的用户来说,是非常重要和实用的技术...
在Linux下,Socket编程可以使用不同的编程语言实现,如C、C++等,其中C语言是最常用的一种,因为它提供了与操作系统底层交互的丰富接口。 Socket编程根据传输协议的不同,可以分为基于TCP的Socket编程和基于UDP的...
本文将深入探讨Linux下的Socket编程,尤其是通过C语言实现的相关知识。 首先,我们需要了解Socket的基本概念。Socket可以看作是网络上的端点,用于发送和接收数据。在Linux中,Socket编程涉及到以下几个关键步骤: ...
在Linux系统中,Socket编程是网络通信的核心技术之一。这里我们关注的是如何使用`select`函数来实现一个并发服务器,这个服务器模型被称为多路复用I/O(Multiplexed Input/Output)。`select`函数是Linux提供的一种I...
如果你了解 C 语言并想穿过网络编程的沼泽,那么你来对地方了。 读者对象 这个文档是一个指南,而不是参考书。如果你刚开始 socket 编程并想找一本入门书,那么你是我的读者。但这不是一本完全的 socket 编程...
本资料"基于linux的socket编程.rar"深入探讨了C语言在Linux环境下的Socket编程,涵盖了基础概念到高级应用,包括多并发处理和TCP、UDP协议的实例。 首先,我们来理解一下基本的套接口概念。套接字是操作系统提供的...
Linux下的Socket编程实例是使用 C/C++ 语言实现的,通过使用 socket 函数创建一个 Socket,然后调用 bind 函数将其与本机地址以及一个本地端口号绑定,最后调用 listen 函数在相应的 socket 上监听。使用 fork 函数...
标题: C语言SOCKET编程指南 描述: 本文档是关于C语言Socket编程的指南,适合初学者,主要介绍如何编写Internet相关程序,重点在于Socket编程的基本操作和结构。虽然内容不是完整的Socket编程书,但可以作为入门学习...
Linux Socket编程是网络编程的重要组成部分,它允许程序员创建和使用网络连接,特别是在TCP/IP协议栈上构建应用程序。本文将深入探讨TCP服务器端的Socket编程,为初学者提供基础的指导。 首先,理解Socket编程的...
在IT行业中,Linux和Socket编程是构建网络应用的基础,尤其对于服务器端的开发而言,C语言作为底层系统编程的常用工具,与Linux和Socket相结合,能够实现高效且灵活的网络通信。下面将深入探讨这个主题。 一、Linux...