c語言send
❶ c語言 send()函數理解
使用函數getsockopt獲得發送緩沖區的長度。用法如下:
int sockfd;
int val;
int len;
sockfd = socket (AF_INET, SOCK_STREAM, 0);
len = sizeof (val);
getsockopt( sockfd, SOL_SOCKET, SO_SNDBUF, &val, &len);
printf ("sndbuf len=%d\n", val);
在32位linux系統上發送緩沖區為16K ,可以使用setsockopt()修改,會影響網路性能
❷ C語言發送郵件
基本框架就是這,需要其他功能自己添加吧
C語言實現簡單的SMTP發送郵件
#include <windows.h>
#include <stdio.h>
#include <WinSock.h>
#include <iostream>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
struct Base64Date6
{
unsigned int d4:6;
unsigned int d3:6;
unsigned int d2:6;
unsigned int d1:6;
};
// 協議中加密部分使用的是base64方法
char ConvertToBase64 (char c6);
void EncodeBase64 (char *dbuf, char *buf128, int len);
void SendMail (char *email,char *body);
int OpenSocket (struct sockaddr *addr);
int main()
{
char EmailTo[] = "[email protected]";
char EmailContents[] = "From: \"lucy\"<[email protected]>\r\n"
"To: \"dasiy\"<[email protected]>\r\n"
"Subject: Hello\r\n\r\n"
"Hello World, Hello Email!";
SendMail(EmailTo, EmailContents);
return 0;
}
char ConvertToBase64(char uc)
{
if(uc < 26)
{
return 'A' + uc;
}
if(uc < 52)
{
return 'a' + (uc - 26);
}
if(uc < 62)
{
return '0' + (uc - 52);
}
if(uc == 62)
{
return '+';
}
return '/';
}
// base64的實現
void EncodeBase64(char *dbuf, char *buf128, int len)
{
struct Base64Date6 *ddd = NULL;
int i = 0;
char buf[256] = {0};
char *tmp = NULL;
char cc = '\0';
memset(buf, 0, 256);
strcpy_s(buf, 256, buf128);
for(i = 1; i <= len/3; i++)
{
tmp = buf + (i-1)*3;
cc = tmp[2];
tmp[2] = tmp[0];
tmp[0] = cc;
ddd = (struct Base64Date6 *)tmp;
dbuf[(i-1)*4+0] = ConvertToBase64((unsigned int)ddd->d1);
dbuf[(i-1)*4+1] = ConvertToBase64((unsigned int)ddd->d2);
dbuf[(i-1)*4+2] = ConvertToBase64((unsigned int)ddd->d3);
dbuf[(i-1)*4+3] = ConvertToBase64((unsigned int)ddd->d4);
}
if(len % 3 == 1)
{
tmp = buf + (i-1)*3;
cc = tmp[2];
tmp[2] = tmp[0];
tmp[0] = cc;
ddd = (struct Base64Date6 *)tmp;
dbuf[(i-1)*4+0] = ConvertToBase64((unsigned int)ddd->d1);
dbuf[(i-1)*4+1] = ConvertToBase64((unsigned int)ddd->d2);
dbuf[(i-1)*4+2] = '=';
dbuf[(i-1)*4+3] = '=';
}
if(len%3 == 2)
{
tmp = buf+(i-1)*3;
cc = tmp[2];
tmp[2] = tmp[0];
tmp[0] = cc;
ddd = (struct Base64Date6 *)tmp;
dbuf[(i-1)*4+0] = ConvertToBase64((unsigned int)ddd->d1);
dbuf[(i-1)*4+1] = ConvertToBase64((unsigned int)ddd->d2);
dbuf[(i-1)*4+2] = ConvertToBase64((unsigned int)ddd->d3);
dbuf[(i-1)*4+3] = '=';
}
return;
}
// 發送郵件
void SendMail(char *email, char *body)
{
int sockfd = {0};
char buf[1500] = {0};
char rbuf[1500] = {0};
char login[128] = {0};
char pass[128] = {0};
WSADATA WSAData;
struct sockaddr_in their_addr = {0};
WSAStartup(MAKEWORD(2, 2), &WSAData);
memset(&their_addr, 0, sizeof(their_addr));
their_addr.sin_family = AF_INET;
their_addr.sin_port = htons(25);
hostent* hptr = gethostbyname("smtp.126.com");
memcpy(&their_addr.sin_addr.S_un.S_addr, hptr->h_addr_list[0], hptr->h_length);
printf("IP of smpt.126.com is : %d:%d:%d:%d\n",
their_addr.sin_addr.S_un.S_un_b.s_b1,
their_addr.sin_addr.S_un.S_un_b.s_b2,
their_addr.sin_addr.S_un.S_un_b.s_b3,
their_addr.sin_addr.S_un.S_un_b.s_b4);
// 連接郵件伺服器,如果連接後沒有響應,則2 秒後重新連接
sockfd = OpenSocket((struct sockaddr *)&their_addr);
memset(rbuf, 0, 1500);
while(recv(sockfd, rbuf, 1500, 0) == 0)
{
cout<<"reconnect..."<<endl;
Sleep(2);
sockfd = OpenSocket((struct sockaddr *)&their_addr);
memset(rbuf, 0, 1500);
}
cout<<rbuf<<endl;
// EHLO
memset(buf, 0, 1500);
sprintf_s(buf, 1500, "EHLO HYL-PC\r\n");
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout<<"EHLO REceive: "<<rbuf<<endl;
// AUTH LOGIN
memset(buf, 0, 1500);
sprintf_s(buf, 1500, "AUTH LOGIN\r\n");
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout<<"Auth Login Receive: "<<rbuf<<endl;
// USER
memset(buf, 0, 1500);
sprintf_s(buf, 1500, "[email protected]");//你的郵箱賬號
memset(login, 0, 128);
EncodeBase64(login, buf, strlen(buf));
sprintf_s(buf, 1500, "%s\r\n", login);
send(sockfd, buf, strlen(buf), 0);
cout<<"Base64 UserName: "<<buf<<endl;
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout<<"User Login Receive: "<<rbuf<<endl;
// PASSWORD
sprintf_s(buf, 1500, "XXXXXXXXXXXX");//你的郵箱密碼
memset(pass, 0, 128);
EncodeBase64(pass, buf, strlen(buf));
sprintf_s(buf, 1500, "%s\r\n", pass);
send(sockfd, buf, strlen(buf), 0);
cout<<"Base64 Password: "<<buf<<endl;
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout<<"Send Password Receive: "<<rbuf<<endl;
// MAIL FROM
memset(buf, 0, 1500);
sprintf_s(buf, 1500, "MAIL FROM: <[email protected]>\r\n");
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout<<"set Mail From Receive: "<<rbuf<<endl;
// RCPT TO 第一個收件人
sprintf_s(buf, 1500, "RCPT TO:<%s>\r\n", email);
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout<<"Tell Sendto Receive: "<<rbuf<<endl;
// DATA 准備開始發送郵件內容
sprintf_s(buf, 1500, "DATA\r\n");
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout<<"Send Mail Prepare Receive: "<<rbuf<<endl;
// 發送郵件內容,\r\n.\r\n內容結束標記
sprintf_s(buf, 1500, "%s\r\n.\r\n", body);
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout<<"Send Mail Receive: "<<rbuf<<endl;
// QUIT
sprintf_s(buf, 1500, "QUIT\r\n");
send(sockfd, buf, strlen(buf), 0);
memset(rbuf, 0, 1500);
recv(sockfd, rbuf, 1500, 0);
cout<<"Quit Receive: "<<rbuf<<endl;
//清理工作
closesocket(sockfd);
WSACleanup();
return;
}
// 打開TCP Socket連接
int OpenSocket(struct sockaddr *addr)
{
int sockfd = 0;
sockfd=socket(PF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
{
cout<<"Open sockfd(TCP) error!"<<endl;
exit(-1);
}
if(connect(sockfd, addr, sizeof(struct sockaddr)) < 0)
{
cout<<"Connect sockfd(TCP) error!"<<endl;
exit(-1);
}
return sockfd;
}
❸ c語言。sendbyte()函數
語法上看:
P2&=0xC0;//p2 與等於 0xc0,相當 P2 = P2&0XC0,
sendbyte(data1);//把data1變數作為參數傳給函數sendbyte,看函數名,似乎是要發送數據的樣子
P2|=0x01;//這句 相當於 P2 = P2|0X01,作用是將P2的最低位值1
❹ send是什麼意思
【基本釋義】send英 [send] 美 [sɛnd]
vt. 發送,寄;派遣;使進入;發射
vi. 派人;寄信
n. 上升運動
n. (Send)人名;(德)森德
[ 過去式 sent 過去分詞 sent 現在分詞 sending ]
【專業釋義及短語】
send [send]
vt.
1、打發,派遣,差遣,派…前去(請人等):
to send somebody to do something
2、派某人去做某事
to send (someone) for a doctor
3、派某人去請大夫
4、使前往;使進入(to ):
to send to the prison
進監獄
5、寄,發送(信件,郵包等):
to send a letter to somebody
6、投,擲;擊出:
to send a punch to the jaw
一拳擊在下巴上
7、使進入(某狀態);迫使(in, into):
to send someone into madness
8、使某人發瘋
9、指點:
to send someone to the police
指點某人去警察局
10、(上天)賜福給,降(福、禍等):
God send us!
上帝保佑!
11、[俚語]使高興,使…興奮:
It sends me into the sky.
這真令我飄飄欲仙。
12、散發出,放出(香味等):
to send forth a sweet odor
發出一股香味
【電子學】
vi.
派遣;發出,派人:
He was sent abroad.
他被派到了海外工作。
【電子學】發信號
adj.
[僅用作定語]用於發送的
短語:
1、God send it may not be so! 但願不是這樣!
2、send flying 攆走,解僱;使四散
3、send someone mad 令某人發瘋
4、send someone packing (或about his business) 解僱某人;攆走某人
5、send someone sprawling 把某人打倒在地
6、send someone to Coventry 見 Coventry
變形:
vt. sent . sending
send2 [send]
n., vi. sended 或sent, sending 【航海學】 = scend
【片語短語】
send out 發送;派遣;放出
send in 遞送;呈報;命…進來
send for 召喚,派人去叫;派人去拿
send back 送回;退還
send a message 發信息
【例句】
1、Please send the book along to me.
請快些把那本書寄給我。
2、You should come or send a representative at least.
你應該來,或者說,至少派一位代表來。
3、The dispute at the moment revolved about the question of whom to send.
當時的爭論是圍繞著派誰去好這一問題而進行的。
❺ C語言 socket編程 客戶端只send一次 但是伺服器會循環執行這條命令 在線等
recv(comm_socket,recv_buff, sizeof(recv_buff), 0); /*receiveclient's command*/
改成
int ret = recv(comm_socket,recv_buff, sizeof(recv_buff), 0); /*receiveclient's command*/
if ret == -1 || ret == 0
break
== -1 表示出錯, =0 表示 socket 已經關閉。
❻ send是什麼意思
1.sendsend英 [send] 美 [sɛnd]
vt.送;派遣;使作出(某種反應);使進入(某狀態)
vt.& vi.用無線電波發送,發出信息
vi.派遣,發出,派人
adj.[僅用作定語]用於發送
2.send是一個C語言函數,可以用於向窗口發送非PowerBuilder預定義事件的消息。
❼ C 語言socket 的send數據太大,最大能發送多少如何分批發送
是這樣,如果是UDP傳輸,一般就是1500左右。如果是TCP大小不一定,比如你要傳10000,有可能一次傳的量是小於10000的任意量。
為了解決這個問題,我建議你用阻塞的SOCKET ,TCP傳輸,用一個循環接收一個大數據包,每次接到多少位元組就將內存下表移動多少,在下次循環中繼續接受,直到傳完一個整包。
❽ C語言中SOCKET關於send和recv的問題,不懂別亂貼
說實在的這個問題非常簡單,不過你習慣太差,你把send和recv的返回值看看不就明白了!
前提是你描述的都是事實。
否則還可能有Socket問題。
如果是linux,strace一下就知道什麼問題了。
Windows的也很簡單。
前面的明顯不正確,send如果是TCP,(UDP 不應該用send),send返回時,消息已經發出了。
❾ 在C語言中send buff的用法
buff是數組名字,中文解釋是緩沖區,一般程序員習慣用buff在存放字元串。
❿ 用C語言編寫socket程序時,聽說send函數有個阻塞模式,不知怎樣才能把它設置為阻塞模式
默認情況下就是阻塞模式了