當前位置:首頁 » 操作系統 » linuxsocketc

linuxsocketc

發布時間: 2023-09-13 11:07:37

『壹』 在linux中C語言socket怎麼將接收到的波形數據(十六進制的數據)存入到本地磁碟中,並按文件分級存放。


估計你是用的tcp socket,導致「videlord」網友說的情況:對於tcp socket,send與recv不是對等的,recv時只要緩沖有數據就會收上來。簡單說就是你send 4次,比如分別為10 10 10 10位元組,對端可以一次recv到這40位元組數據,也可以recv 40次、每次1位元組。


解決辦法有兩種:

  1. 改用udp socket,send/recv自然對等了

  2. 繼續用tcp socket,自己進行數據分段:比如自行約定在數據前約定4個位元組用於描述數據長度,這樣發送時,send 4+33位元組,send 4+35位元組;接收時,先獲取描述長度的4位元組獲得長度,再按照長度接收數據(可能需要多次recv湊齊指定長度)。




『貳』 Linux下socket並發連接數怎麼設置

並發socket連接數的多少決定於系統資源的多少,沒有一個常值的.在實際開發或者linux系統管理中也會根據需配段要進行相應的設置.
1.一般來說每一個網路連接,都會敗銷建立相應的socket句柄,同時每個連接也會有標准輸入輸出等基本的文件文件句柄,而且每一個socket連接都是進行文件操作的,因此連接數決定於系統資源.

2.Linux上一般可以通過ulimit來進行相應的資源限制,默認能打開的文件描述符自己可以查看.如下圖所示:

3.ulimit的命令格式:ulimit [-acdfHlmnpsStvw] [size]
參數說明:
-H 設置硬資源限制.
-S 設置軟資源限制.
-a 顯示當前所有的資源限制.
-c size:設置core文件的最大值.單位:blocks
-d size:設置數據段的最大值.單位:kbytes
-f size:設置創建文件的最大值.單位:blocks
-l size:設置在內存中鎖定進程的最大值.單位:kbytes
-m size:設置可以使用的培枯譽常駐內存的最大值.單位:kbytes
-n size:設置內核可以同時打開的文件描述符的最大值.單位:n
-p size:設置管道緩沖區的最大值.單位:kbytes
-s size:設置堆棧的最大值.單位:kbytes
-t size:設置CPU使用時間的最大上限.單位:seconds
-v size:設置虛擬內存的最大值.單位:kbytes
-u <程序數目> 用戶最多可開啟的程序數目

『叄』 linux C語言編程,socket實現的即使通訊系統

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>

intmain(void)
{
//createsocket
intfd=socket(AF_INET,SOCK_DGRAM,0);
if(fd==-1)
{
perror("socket ");
exit(-1);
}
printf("socketfd=%d ",fd);

//buildconnectionaddress
structsockaddr_inaddr;
addr.sin_family=AF_INET;
addr.sin_port=htons(6666);
addr.sin_addr.s_addr=inet_addr("127.0.0.1");

intr;
r=bind(fd,(structsockaddr*)&addr,sizeof(addr));
if(r==-1)
{
perror("bind");
close(fd);
exit(-1);
}
printf("bindaddresssuccessful! ");
//acceptorsendmessage
charbuf[255];
structsockaddr_infrom;
socklen_tlen;
len=sizeof(from);
while(1)
{
r=recvfrom(fd,buf,sizeof(buf)-1,0,(structsockaddr*)&from,&len);
if(r>0)
{
buf[r]=0;
printf("Themessagefrom%sis:%s ",inet_ntoa(from.sin_addr),buf);
}
else
{
break;
}
}
//closesocket
close(fd);
return0;
}

test2.c

java">#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>

intmain(void)
{
//createsocket
intfd=socket(AF_INET,SOCK_DGRAM,0);
if(fd==-1)
{
perror("socket");
exit(-1);
}
printf("createsocketOK! ");
//createansendaddress
structsockaddr_inaddr={};
addr.sin_family=AF_INET;
addr.sin_port=htons(6666);
addr.sin_addr.s_addr=inet_addr("127.0.0.1");
//
intr;
charbuf[255];
while(1)
{
r=read(0,buf,sizeof(buf)-1);
if(r<=0)
break;
sendto(fd,buf,r,0,(structsockaddr*)&addr,sizeof(addr));
}
//closesocket
close(fd);
return0;
}

先運行test1.c,然後運行test2.c,在test2.c運行後輸入內容,在test1.c所在終端中就會顯示信息

運行結果如下:

『肆』 linux下C語言用socket網路編程怎麼計算傳輸速度

這要你的通信程序協商一個協議,比如定義一個通信結構體,傳文件的時候,一開始發送結構體的信息過去,告訴對端你的文件總大小,然後,傳輸過程中,統計已經收到或者發送的數據,做個除法就得到速率了。

具體這類協商,你可以自己隨便想,也可以借鑒現有的比較好的一些設計,有些考慮斷點續傳的技術,還有壓縮的,看你代碼也不需要考慮吧。

『伍』 socket linux c++ send()函數

給你一個代碼,linux下編譯運行即可,做了簡單的注釋,client.c如下:

send()函數在client.c末尾

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>

#defineMAXLINE4096//發送接受信息長度
#definePORT6666//埠

intmain(intargc,char**argv)
{
intsockfd,n;
charrecvline[MAXLINE],sendline[MAXLINE];
structsockaddr_inservaddr;

if(argc!=2){
printf("usage:./client<ipaddress> ");//使用方法
exit(0);
}

if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0){//創建套接字,並未連接
printf("createsocketerror:%s(errno:%d) ",strerror(errno),errno);
exit(0);
}


//memset(結構體地址,清零,要清零的長度);清零結構體servaddr,將結構體數據全部設置為0
//同bzero(結構體地址,要清理的長度);默認清零
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family=AF_INET;//sa_family是通信類型,最常用的值是"AF_INET"
servaddr.sin_port=htons(PORT);//埠號

//servaddr.sin_addr.s_addr=inet_addr(argv[1]);//伺服器IP,如下功能相同
if(inet_pton(AF_INET,argv[1],&servaddr.sin_addr)<=0){
printf("inet_ptonerrorfor%s ",argv[1]);
exit(0);
}

//連接伺服器
if(connect(sockfd,(structsockaddr*)&servaddr,sizeof(servaddr))<0){
printf("connecterror:%s(errno:%d) ",strerror(errno),errno);
exit(0);
}

printf("sendmsgtoserver: ");
fgets(sendline,MAXLINE,stdin);//輸入向伺服器發送的信息

if(send(sockfd,sendline,strlen(sendline),0)<0)//向伺服器發送信息
{
printf("sendmsgerror:%s(errno:%d) ",strerror(errno),errno);
exit(0);
}

close(sockfd);//關閉套接字
exit(0);
}

伺服器程序:server.c如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>

#defineMAXLINE4096
#definePORT6666

intmain(intargc,char**argv)
{
intlistenfd,connfd;
structsockaddr_inservaddr;
charbuff[MAXLINE];
intn;

if((listenfd=socket(AF_INET,SOCK_STREAM,0))==-1){//創建套接字
printf("createsocketerror:%s(errno:%d) ",strerror(errno),errno);
exit(0);
}

memset(&servaddr,0,sizeof(servaddr));//結構體清零
servaddr.sin_family=AF_INET;//sa_family是通信類型,最常用的值是"AF_INET"
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);//指定接受任何連接
servaddr.sin_port=htons(PORT);//監聽埠

//給套介面綁定地址
if(bind(listenfd,(structsockaddr*)&servaddr,sizeof(servaddr))==-1){
printf("bindsocketerror:%s(errno:%d) ",strerror(errno),errno);
exit(0);
}

if(listen(listenfd,10)==-1){//開始監聽,最大請求數為10,可以自己設置
printf("listensocketerror:%s(errno:%d) ",strerror(errno),errno);
exit(0);
}

printf("======waitingforclient'srequest====== ");

while(1){
//建立通信,等待客戶端connect()函數的連接
if((connfd=accept(listenfd,(structsockaddr*)NULL,NULL))==-1)
{
printf("acceptsocketerror:%s(errno:%d)",strerror(errno),errno);
continue;
}
n=recv(connfd,buff,MAXLINE,0);//n可以判斷錯誤,此處可直接用recv()函數
//接收到的信息存放在buff中
buff[n]='';//添加結束符
printf("recvmsgfromclient:%s ",buff);
close(connfd);
}

close(listenfd);
}

『陸』 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;
}

『柒』 Linux(或C語言)和JAVA下的socket編程有什麼異同點

不同:
1.首先2者提供的介面不同,這點很容易區分。
2.java跨平台,寫好的程序不用做任何修改就可以放到linux或者windows或者蘋果等諸多操作系統上運行,C當然可以,但linux本身提供了socket的
系統調用
,你如果使用的是linux系統調用,那麼你的程序只能在linux下運行,這點不難理解。但如果是C的
庫函數
,那還是可以跨平台的
3.利用linux系統調用的速度是要快於JAVA提供的SOCKET介面。
相同性我就不說了,你看完我下面的話,你就能理解他們直接的關系了。
從你提出的問題,我覺的你可能對編程不是很了解。
socket是用來實現
進程通信
(主要是網路通信)的目的,但這不是語言能夠解決的問題,確切的說語言連什麼是進程他都不知道。這么說來SOCKET不是JAVA帶的功能,那麼JAVA是如何來實現這一功能的呢?JAVA是通過調用系統提供的SOCKET來完成的。
在LINUX裡面,JAVA中的SCOKET最終就是通過調用系統提供的系統調用來完成,而系統調用的SOCKET則是操作系統和硬體共同完成的。所以他們共同點是,如果你的
JAVA程序
是在LINUX中運行的,那他們通信的具體過程會完全一樣,只不過JAVA會在系統調用前面加上一些它認為必需加的東西或者是它認為能夠方便編程人員使用的東西。

熱點內容
c語言鏈表的排序 發布:2025-01-25 06:48:17 瀏覽:887
查看存儲空間的命令 發布:2025-01-25 06:40:06 瀏覽:610
安卓系統如何保活 發布:2025-01-25 06:36:27 瀏覽:779
緩存不退出 發布:2025-01-25 06:35:02 瀏覽:265
protel編譯 發布:2025-01-25 06:35:00 瀏覽:203
bt我的世界伺服器 發布:2025-01-25 06:33:35 瀏覽:392
桃子解壓碼 發布:2025-01-25 06:26:46 瀏覽:726
ubuntu飢荒伺服器搭建伺服器 發布:2025-01-25 06:19:54 瀏覽:51
安卓怎麼登錄蘋果碧藍航線 發布:2025-01-25 06:15:22 瀏覽:650
如何打開sqlserver2008 發布:2025-01-25 06:12:33 瀏覽:994